每次只能写出几道题 涨个20分左右 听老师的开个复盘文吧
Codeforces Round 926 (Div.2)
A. Sasha and the Beautiful Array
从2到n的所有 (ai−ai−1)就是an-ai 然后排序还是不限次数随便改 那就直接出最大值减最小值就OK了 这种题到底是怎么混进div2的
#include <iostream>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
int minn=1e9,maxx=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int tmp;
scanf("%d",&tmp);
minn=min(minn,tmp);
maxx=max(maxx,tmp);
}
cout << maxx-minn << endl;
}
return 0;
}
B. Sasha and the Drawing
每个case给一个n表示正方形大小,要求有k条对角线上有格子被涂黑,需要输出至少涂的格子个数
每个格子涂完可以搞定两条对角线 最后有个重复的就行 记得特判
#include <iostream>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,k;
scanf("%d%d",&n,&k);
if(k<=(n-1)*4)
cout<<(k+1)/2<<endl;
else
cout<<k-2*n+2<<endl;
}
return 0;
}
后面开摆了 下一场
Codeforces Round 927 (Div.3)
A. Thorns and Coins
没啥好说的 遍历跑一遍 不对就break就完事了
#include <stdio.h>
#include <stdlib.h>
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,cnt=0;
scanf("%d\n",&n);
char s[60];
gets(s);
for(int i=0;i<n;i++)
{
if(s[i]=='@')
cnt++;
else if(s[i]=='*'&&s[i+1]=='*')
break;
}
printf("%d\n",cnt);
}
return 0;
}
B. Chaya Calendar
题意就是按顺序把数组里数的整数倍都发现一次 数据太大 遍历肯定是不行力 想想办法吧
当我第一件事情发生之后 我要等待比此时大的最小的第二件事周期的整数倍 那干脆现在的时间除这个周期 然后+1再乘回去就行了 仍然没啥含金量
#include <stdio.h>
#include <stdlib.h>
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,i=0;
scanf("%d",&n);
int a[n];
for(int j=0;j<n;j++)
{
scanf("%d",&a[j]);
}
int cnt=a[0];
for(i=1;i<n;i++)
{
int t=cnt/a[i]+1;
cnt=t*a[i];
}
printf("%d\n",cnt);
}
return 0;
}
Codeforces Round 929 (Div.3)
A. Turtle Puzzle: Rearrange and Negate
给一堆数 可以对任何数乘-1 求做操作后可获得的最大和
全求绝对值不就完了
#include <stdio.h>
#include <stdlib.h>
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,i=0;
scanf("%d",&n);
int a[n];
for(int j=0;j<n;j++)
{
scanf("%d",&a[j]);
}
int cnt=a[0];
for(i=1;i<n;i++)
{
int t=cnt/a[i]+1;
cnt=t*a[i];
}
printf("%d\n",cnt);
}
return 0;
}
B. Turtle Math: Fast Three Task
题意:减去最少个数的数字使数组和为3的倍数
答案显然只可能是0,1,2 先把一开始的和取个模看看差几 差1直接秒了
差2的话就看看有没有某一项也差2 有的话就直接去那一项就行
#include <stdio.h>
#include <stdlib.h>
int sum(int a[],int len)
{
int ret=0;
for(int i=0;i<len;i++)
{
ret+=a[i];
}
return ret;
}
int min(int a,int b)
{
if(a<=b)
return a;
return b;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int len;
scanf("%d",&len);
int a[len];
for(int i=0;i<len;i++)
{
scanf("%d",&a[i]);
}
int prt;
if(sum(a,len)%3==0)
{
prt=0;
}
else
{
int temp=sum(a,len)%3;
int m=1e9;
for(int i=0;i<len;i++)
{
m=min(abs(a[i]%3-temp),m);
}
if(m==0||temp==2)
prt=1;
else
{
prt=2;
}
}
printf("%d\n",prt);
}
return 0;
}
D. Turtle Tenacity: Continual Mods
随便改变数组顺序 有没有机会让他从头模到尾不等于0
如果只有一个1没有别的了就直接放最前面就秒了
要不然从小到大排序第一个第二个不一样也能造一个1在最前面 跟上面一样
如果前两个数都是1就寄了 但如果前两个数都相等但不都等于1的话我可以在后面找一个特别大的数调过去继续凑开头的1
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int len;
scanf("%d",&len);
int s[len];
for(int i=0;i<len;i++)
{
scanf("%d",&s[i]);
}
sort(s,s+len);
if(s[0]!=s[1])
printf("YES\n");
else
{
if(s[0]==1)
printf("NO\n");
else
{
int flag=0;
for(int i=0;i<len;i++)
{
if(s[i]%s[0]!=0)
flag=1;
}
if(flag==1)
printf("YES\n");
else
{
printf("NO\n");
}
}
}
}
return 0;
}
Codeforces Round 930 (Div.2)
A. Shuffle Party
给定一个1-n的顺序数组 从2开始把每个数下标和他最大因数为下标的数和他交换 问最后1在哪个位置
不用考虑前面的,只考虑后面的,1每次移位一定是去到了自己原来位置2倍下标的点 那就一个循环解决了
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
long long findx(long long x)
{
for(long long i=2;i<=sqrt(x);i++)
{
if(x%i==0)
return x/i;
}
return 1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
long long n;
scanf("%lld",&n);
long long now=1;
while(now*2<=n)
{
now*=2;
}
printf("%lld\n",now);
}
return 0;
}
B. Binary Path
找路 从左上到右下 输出字典序最小的路 和这么走的可能情况数
右边是1下边是0就往下走 不然永远往右走 然后循环里加上计数就行
#include <stdio.h>
#include <stdlib.h>
int main()
{
int T;
scanf("%d\n",&T);
while(T--)
{
int n;
scanf("%d\n",&n);
char s[2][n+1];
for(int i=0; i<2; i++)
scanf("%s",s[i]);
//for(int i=0;i<2;i++)
// puts(s[i]);
int way=0,i=0;
for(i=0; i<n; i++)
{
printf("%c",s[0][i]);
if(s[0][i+1]=='1'&&s[1][i]=='0')
{
break;
}
else if(s[0][i+1]==s[1][i])
way++;
}
//printf("i=%d\n",i);
if(i==n)
{
printf("%c",s[1][n-1]);
printf("\n%d\n",way);
}
else
{
for(; i<n; i++)
{
printf("%c",s[1][i]);
}
printf("\n%d\n",way);
}
}
return 0;
}
Codeforces Round 932 (Div.2)
A. Entertainment in MAC
对一段字符串 可以倒转他 也可以把反转的他加到正序的他后面
求最小字典序的结果 从左往右找到中间判断需不需要反转就行
#include <stdio.h>
#include <stdlib.h>
int main()
{
int T;
scanf("%d\n",&T);
while(T--)
{
int n;
scanf("%d\n",&n);
char s[2][n+1];
for(int i=0; i<2; i++)
scanf("%s",s[i]);
//for(int i=0;i<2;i++)
// puts(s[i]);
int way=0,i=0;
for(i=0; i<n; i++)
{
printf("%c",s[0][i]);
if(s[0][i+1]=='1'&&s[1][i]=='0')
{
break;
}
else if(s[0][i+1]==s[1][i])
way++;
}
//printf("i=%d\n",i);
if(i==n)
{
printf("%c",s[1][n-1]);
printf("\n%d\n",way);
}
else
{
for(; i<n; i++)
{
printf("%c",s[1][i]);
}
printf("\n%d\n",way);
}
}
return 0;
}
Codeforces Round 933 (Div.3)
A. Rudolf and the Ticket
才100 直接O(nm)遍历就行
#include <iostream>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
int b[n],c[m];
for(int i=0;i<n;i++)
scanf("%d",&b[i]);
for(int i=0;i<m;i++)
scanf("%d",&c[i]);
int cnt=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(b[i]+c[j]<=k)
cnt++;
}
}
cout << cnt << endl;
}
return 0;
}
B. Rudolf and 121
将思维逆转过来 一斤鸭梨!
减不好想就改成空数组往上加 最边边只能一个一个往下加 处理完最外边边 第二层就是新的边边 加到中间之后看看加出来的数组是不是和原数组完全相同即可
#include <iostream>
using namespace std;
int unequal(int a[],int b[],int n)
{
for(int i=0;i<n;i++)
{
if(a[i]!=b[i])
return 1;
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
//printf("n=%d\n",n);
int s[200010],my[200010];
for(int i=0;i<n;i++)
{
scanf("%d",&s[i]);
//printf("ÊäÈë³É¹¦\n");
my[i]=0;
}
int l=0,r=n-1;
//printf("l=%d r=%d\n",l,r);
while(l<r&&s[l]>=my[l]&&s[r]>=my[r])
{
//printf("l=%d r=%d\n",l,r);
int base=s[l]-my[l];
my[l]+=base;
my[l+1]+=base*2;
my[l+2]+=base;
l++;
base=s[r]-my[r];
my[r]+=base;
my[r-1]+=base*2;
my[r-2]+=base;
r--;
}
if(unequal(my,s,n))
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
return 0;
}
C. Rudolf and the Ugly String
mapie这种情况价格特判就行
(我也不知道为什么我一开始会看成只能删最左边或者最右边的数浪费了半小时)
#include <iostream>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
char s[n+1];
int l1=0,l2=0;
cin>>s;
int ans=0;
for(int i=0;i<n;i++)
{
if(s[i]=='m'&&s[i+1]=='a'&&s[i+2]=='p'&&s[i+3]=='i'&&s[i+4]=='e')
{
ans++;
s[i+2]='q';
}
else if(s[i]=='m'&&s[i+1]=='a'&&s[i+2]=='p')
{
ans++;
}
else if(s[i]=='p'&&s[i+1]=='i'&&s[i+2]=='e')
{
ans++;
}
}
cout << ans << endl;
//cout << s[n] << endl;
/*for(int i=n-1;i>=0;i--)
{
if(l2==0)
{
if(s[i]=='m'&&s[i+1]=='a'&&s[i+2]=='p')
l2=i;
else if(s[i]=='p'&&s[i+1]=='i'&&s[i+2]=='e')
l2=i;
}
else
{
if(s[i]=='m'&&s[i+1]=='a'&&s[i+2]=='p')
{
l1=i;
break;
}
else if(s[i]=='p'&&s[i+1]=='i'&&s[i+2]=='e')
{
l1=i;
break;
}
}
}
int r1=0,r2=0;
for(int i=0;i<n;i++)
{
if(r1==0)
{
if(s[i]=='m'&&s[i+1]=='a'&&s[i+2]=='p')
r1=i+2;
else if(s[i]=='p'&&s[i+1]=='i'&&s[i+2]=='e')
r1=i+2;
}
else
{
if(s[i]=='m'&&s[i+1]=='a'&&s[i+2]=='p')
{
r2=i+2;
break;
}
else if(s[i]=='p'&&s[i+1]=='i'&&s[i+2]=='e')
{
r2=i+2;
break;
}
}
}
printf("l1=%d l2=%d r1=%d r2=%d\n",l1,l2,r1,r2);
int left=max(r2-l1-1,r1-l2-1);
cout << left <<endl;
cout << n-left << endl;*/
}
return 0;
}