做了一个小时有事出去了,所以还没看其他的题目,放寒假的时候再补上吧。
A :dreamstart的催促
简单快速幂的运用,水题。
链接:https://ac.nowcoder.com/acm/contest/322/A
来源:牛客网
题目描述
有一天集训队的学弟们正在计算一堆数,但是dreamstart感觉他们算的太慢了,就让他们坐在一起想出一个快速计算的方法,但是由于他们一时想不出来,想让你帮助他们。他们说现在有一个数列,要算出第 i 个数的 i 次幂并且把每个数计算出来的值加到一起,最后答案模10000019。
聪明的你可以帮助他们吗?
输入描述:
第一行有一个整数n,n <= 1e5
接下来一行有n个数,每个数的大小不超过1e16
输出描述:
输出取模之后的和
示例1
输入
4
1 6 9 12
输出
21502
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
typedef long long LL;
using namespace std;
const long long mod=10000019;
LL power(LL a, LL b, LL c)
{
int res = 1;
a %= c;
while (b)
{
if (b & 1)
res = (res * a) % c;
a = (a * a) % c;
b >>= 1;
}
return res;
}
LL a[100000+10];
int main()
{
LL n,m,j,k,i,T;
scanf("%lld",&n);
LL ans=0;
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ans += power(a[i],i,mod);
ans%=mod;
}
printf("%lld
",ans);
return 0;
}
D : >A->B->C-
简单的数组下标运用,如果数据大了,推荐用map写
链接:https://ac.nowcoder.com/acm/contest/322/D
来源:牛客网
题目描述
一天小A在金色的银杏树下向他喜欢的小姐姐B表白了,“对不起,我喜欢的是C”,B这样说道,小A尴尬的笑了笑转身离开了。他心里默默说着“对不起,C喜欢我。”(233333333)
Love triangle被定义为:如果A喜欢B,B喜欢C,C喜欢A则称为Love triangle。现在让你寻找有没有Love triangle。
输入描述:
第一行一个正整数N(n<=5000),第二行n个数X1,X2,X3……Xn代表i喜欢Xi。
输出描述:
如果存在Love triangle则输出YES,没有则输出NO。
示例1
输入
5
2 4 5 1 3
输出
YES
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
typedef long long LL;
using namespace std;
int a[100000+10];
int main()
{
int n,m,j,k,i,T;
cin>>n;
for (i=1;i<=n;i++)
{
cin>>a[i];
}
bool flag=false;
int x,y,z;
for (i=1;i<=n;i++)
{
x= i;
y = a[i];
z = a[a[i]];
if (a[a[a[i]]] == x)
{
flag = true;
//printf("%d %d %d
",x,y,z);
break;
}
}
if (flag) cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
F : 集训队脱单大法:这是一道只能由学姐我自己出数据的水题
稍微整理一下就能推出公式了,暴力超时。
链接:https://ac.nowcoder.com/acm/contest/322/F
来源:牛客网
题目描述
总所不周知!ZZZZone有了女朋友却谁也不知道。但是ZZZZone在集训队总是和陈大佬走的很近,每天搂搂抱抱十分不成体统!于是就被ZZZZone的女朋友给知道了,但是呢,ZZZZone的女朋友是一个热爱画画的温柔又可爱的女子,于是她决定把ZZZZone大卸两块,没错是两块!!
ZZZZone呢他的长度为 n,并且每个单位长度都有一个相对应的重量,他的小女朋友希望将ZZZZone切成两部分后,两个部分中的最大重量之差的绝对值最大(显然两个部分均不能为空啊),她呢觉得很惆怅,不知道该怎么切最好,所以想让你们来想想办法。
输入描述:
第一行为一个n(2 <= n <= 105),表示ZZZZone的长度,第二行为n个数,表示ZZZZone每个单位长度的重量(0 <= a[i] <= 106)。
输出描述:
输出切成两部分后,每部分的重量的最大值之差的绝对值最大是多少。
示例1
输入
4
3 4 1 6
输出
3
备注:
对于样例:
4
3 4 1 6
那么一共有 3 种切法,分别是:
第一部分为 { 3 }, 第二部分为{ 4,1,6 },此时两部分的最大值之差的绝对值为 3
第一部分为 { 3,4 }, 第二部分为{ 1, 6 },此时两部分的最大值之差的绝对值为 2
第一部分为 { 3,4,1 }, 第二部分为{ 6 },此时两部分的最大值之差的绝对值为 2
所以答案为3.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
typedef long long LL;
using namespace std;
int a[100000+10];
int main()
{
int n,m,j,k,i,T;
cin>>n;
int max = -1;
for (i=0;i<n;i++)
{
cin>>a[i];
if (a[i]>=max)
max = a[i];
}
if (max!=a[0] && max!=a[n-1])
{
if (a[0]<a[n-1])
cout<<max-a[0]<<endl;
else
cout<<max-a[n-1]<<endl;
}
else
{
if (max==a[0])
cout<<max-a[n-1]<<endl;
else if (max==a[n-1])
cout<<max-a[0]<<endl;
}
return 0;
}
I :小A的期末作业
我竟然没有在3分钟内写完,唉!手速不行了。
链接:https://ac.nowcoder.com/acm/contest/322/I
来源:牛客网
题目描述
期末了, 老师给小A布置了一道期末作业, 让小A设计一个图案, 追求完美的小A想要用编程来完成这个图案:
小A想要设计一个由*符号组成的“大于号”图案, 图案的大小为n, 一共有2n-1行, 每行有n个*符号, 每一行前面有一些空格。
第一行没有空格, 第二行有一个空格, 第三行有两个空格。。。。 依次类推
图案是轴对称图形。
输入描述:
读入一个数字n(1 <= n <= 100), 表示图案的大小.
输出描述:
输出小A想要的图形
示例1
输入
4
输出
****
****
****
****
****
****
****
示例2
输入
5
输出
*****
*****
*****
*****
*****
*****
*****
*****
*****
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
typedef long long LL;
using namespace std;
int main() {
int n,m,j,k,i,T;
while (cin>>n) {
int a = n-1;
///////////////////////
for (i=0; i<a; i++) {
for (j=0; j<i; j++)
printf(" ");
for (k=1; k<=n; k++)
printf("*");
printf("
");
}
///////////////////////
for (i=1; i<n; i++)
printf(" ");
for (i=1; i<=n; i++)
printf("*");
printf("
");
/////////////////////////
for (i=a-1; i>=0; i--) {
for (j=0; j<i; j++)
printf(" ");
for (k=1; k<=n; k++)
printf("*");
printf("
");
}
}
return 0;
}
K : 正方体
就是这么几种情况,
中间的一行一定是第一个格子==第三个格子,第二个格子==第四个格子。
然后第一行 要有一个不为0的数字和第三行不为0的数字相等 就行
链接:https://ac.nowcoder.com/acm/contest/322/K
来源:牛客网
题目描述
已知一个正方体,每个面上都有任意一个数(假设每一面的面积足够大来装下当前面上的数字),现被展开成了如下形式:
输入中保证第一行有一个面,第二行有四个面,第三行有一个面。请用代码检查这个正方体对立面上的数是否相同。
输入描述:
输入包含多个测试样例。第一行为一个整数T(1 <= T <= 1e4),接下来每个样例占3行,每行都包括4个数,为0表明当前位置不表示面,每个面上的数值范围不超过int。
Eg:上图的输入为:
0 1 0 0
2 4 2 4
0 0 1 0
输出描述:
对于每个测试样例,如果当前正方体的三个对立面的数都分别相同的话就输出”Yes!”,否则输出”No!”。每个结果占一行,注意每50个结果要加一个空行。
示例1
输入
3
0 2 0 0
1 3 1 3
0 2 0 0
0 2 0 0
1 3 1 3
0 0 0 2
0 0 0 2
1 2 2 1
0 0 1 0
输出
Yes!
Yes!
No!
#include<iostream>
using namespace std;
int main()
{
int n,m,j,k,i,T;
int a[10],b[10],c[10];
cin>>T;
int count=0;
while (T--)
{
count++;
for (i=0;i<4;i++)
cin>>a[i];
for (i=0;i<4;i++)
cin>>b[i];
for (i=0;i<4;i++)
cin>>c[i];
bool flag = false;
if (b[0]==b[2]&&b[1]==b[3])
{
for (i=0;i<4;i++)
{
for (j=0;j<4;j++)
{
if (a[i]!=0&&c[j]!=0&&a[i]==c[j])
{
flag = true;
break;
}
}
}
}
if (flag)
cout<<"Yes!"<<endl;
else
cout<<"No!"<<endl;
if (count%50==0)
cout<<endl;
}
return 0;
}
L : 简单的分数
water
链接:https://ac.nowcoder.com/acm/contest/322/L
来源:牛客网
题目描述
John最近对分数很感兴趣,在研究分数的加减运算。现在要求计算两个分数的运算。
输入描述:
输入一个正整数T,表示有T组数据
每组数据包括5个整数op,a,b,c,d
op为1表示a/b + c/d;op为0表示为a/b – c/d
其中1 <= T, a,b,c,d <= 100;
输出描述:
输出分数运算结果“x/y”,要求x/y是最简分数。
示例1
输入
4
1 1 2 1 3
0 1 2 1 2
1 1 2 1 2
0 1 3 1 2
输出
5/6
0/1
1/1
-1/6
备注:
如果有运算符,应在x前面,如“-1/6”,而不是“1/-6”。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
typedef long long LL;
using namespace std;
int gcd(int a,int b)
{
return a%b==0?b:gcd(b,a%b);
}
int main()
{
int n,m,j,k,i,T,a,b,c,d,op;
int e,f;
cin>>T;
while (T--)
{
bool fu = false;
cin>>op>>a>>b>>c>>d;
if (op==1)
{
f = b*d;
e = a*d+b*c;
}
else if (op==0)
{
f = b*d;
e = a*d-b*c;
}
int x = gcd(e,f);
e/=x;
f/=x;
if ( (e<0)&&(f>0) || (e>0&&f<0))
{
fu = true;
e = abs(e);
f = abs(f);
}
if (e<0 && f<0)
{
e = abs(e);
f = abs(f);
}
if (fu)
cout<<"-"<<e<<"/"<<f<<endl;
else
cout<<e<<"/"<<f<<endl;
}
return 0;
}
M : Hj 浇花
很巧妙的方法,暴力不可取。
如果在【a,b】间浇水,则开一个数组记录发 f [a]++ , f [b+1]--;
那么前 f 的和就是 f 被浇水的次数,用到了前缀数组和的思想。
链接:https://ac.nowcoder.com/acm/contest/322/M
来源:牛客网
题目描述
HJ养了很多花(99999999999999999999999999999999999盆),并且喜欢把它们排成一排,编号0~99999999999999999999999999999999998,每天HJ都会给他的花浇水,但是他很奇怪,他会浇n(1 <= n <= 2 * 105)次水,每次都会选择一个区间[l, r],(0 <= l <= r <= 106),表示对区间[l, r]的花都浇一次水。现在问你,通过这些操作之后,被浇了i(1 <= i <= n)次水的花的盆数。
输入描述:
输入:第一行一个n,表示HJ的操作次数,接下来的n行,表示每一次选择的浇水区间。
输出描述:
输出:输出n个数字Cnt1, Cnt2……Cntn,(用空格隔开)Cnti表示被浇了i次水的花的盆数。
示例1
输入
3 0 3 1 3 3 8
输出
6 2 1
示例2
输入
3 1 3 2 4 5 7
输出
5 2 0
说明
对于样例1的图形解释
被浇了1次的有:0, 4, 5, 6, 7, 8, cnt1 = 6
被浇了2次的有:1, 2. cnt2 = 2
被浇了3次的有: 3 . cnt3 = 3
#include<iostream>
using namespace std;
int a[1000000+10],b[1000000+10];
int main()
{
int n,m,j,k,i,T,x,y;
cin>>n;
int min=0x3fffffff,max=-1;
for (i=0;i<n;i++)
{
cin>>x>>y;
if (x<min) min = x;
if (y>max) max = y;
a[x]++;
a[y+1]--;
}
for (i=min;i<=max;i++)
{
a[i] += a[i-1];
b[a[i]]++;
}
for (i=1;i<=n;i++)
{
cout<<b[i]<<" ";
}
cout<<endl;
return 0;
}