(感觉这场有点毒呀,是我太菜了)
题目传送门:
A. Red-Blue Shuffle
给你n张牌,每张牌上有一个红色的数字和一个蓝色的数字,你可以将牌随便排序,问你是红色组成的数字大于蓝色的概率大,还是蓝色组成的数字大于红色的概率大,还是两者相等。
题目也没要求具体的概率。那么显然牌上红色数字大于蓝色的数字的牌的数量比较多的话,那么就是红色赢。同理也可判断出蓝色赢或者两者平局。
#include
using namespace std;
int a[1005],b[1005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int num1=0,num2=0;
for(int i=1;i<=n;i++)
scanf("%1d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%1d",&b[i]);
for(int i=1;i<=n;i++)
{
if(a[i]>b[i]) num1++;
else if(b[i]>a[i]) num2++;
}
if(num1>num2) printf("RED\n");
else if(num1==num2) printf("EQUAL\n");
else printf("BLUE\n");
}
//system("pause");
return 0;
}
题目传送门:
B. Move and Turn
有一个无限展的二维平面,一个机器人每秒可以前进一个单位,但是每一秒之后,机器人必须向左转或者向右转。问你n秒之后机器人可能出现的坐标的数量。
一看感觉应该是有规律。于是先敲了一个dfs的代码,暴力跑了前面10几个数据。
n=1 —— res=4
n=2 —— res=4
n=3 —— res=12
n=4 —— res=9
n=5 —— res=24
n=6 —— res=16
n=7 —— res=40
n=8 —— res=25
n=9 —— res=60
那么到这里规律应该就很明显了。把奇数和偶数分开来看,第k个偶数的答案就是(k+1)^2,第k个奇数的答案就是( 1 + k ) * k / 2 * 4
#include
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int a=4,b=4;
if(n%2==1)
{
int k=(n+1)/2;
int ans=(1+k)*k/2;
printf("%d\n",4*ans);
}
else
{
int k=n/2;
printf("%d\n",(k+1)*(k+1));
}
//system("pause");
return 0;
}
题目传送门:
C. Row GCD
(不要问我以下是怎么证出来的,因为我也不会,如果有看到的小伙伴知道的话请教教我)
1、gcd(a1,a2,a3,a4……)=gcd(a1,gcd(a2,a3,a4……))
2、gcd(a1,a2) = gcd(a1 , a2-a1)
然后就可以推导题目所求
gcd(a1+d , a2+d , a3+d , a4+d)=gcd(a1+d , a2 - a1 , a3 - a2 , a4 - a3 ) = gcd(a1+d , gcd ( a2 - a1 , a3 - a2 , a4 - a3 ) )
#include
using namespace std;
typedef long long LL;
const int N=2e5+10;
LL a[N],b[N];
LL gcd(LL a,LL b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=m;i++)
scanf("%lld",&b[i]);
if(n==1)
{
for(int i=1;i<=m;i++)
printf("%lld ",a[1]+b[i]);
return 0;
}
sort(a+1,a+1+n);
LL ans=a[2]-a[1];
for(int i=2;i<=n;i++)
ans=gcd(ans,a[i]-a[i-1]);
for(int i=1;i<=m;i++)
printf("%lld ",gcd(ans,a[1]+b[i]));
printf("\n");
//system("pause");
return 0;
}