11.2 Educational Codeforces Round 63 (Rated for Div. 2)

mac2026-04-12  4

总结:

缺点:

英语阅读不行。题目做得太少,A题一开始看不懂,还以为是求回文串,做完B才知道是字典序问题。没有考虑下标问题,输出没处理好。知识点薄弱(dp)。

A - Reverse a Substring

思路:问是否可以颠倒两个字符使出现字典序更小的串,遍历保存字典序较大的字符即可,当出现字典序更小的字符交换 然后输出结束程序,如果循环结束还没结束就输出no。 wa问题:没注意下标直接输出cc和i ,需要+1。

#include<bits/stdc++.h> #define ll long long #define R register int #define inf 0x3f3f3f3f #define mod 1000000007; using namespace std; inline ll read(){ ll s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } void put1(){ puts("YES") ;} void put2(){ puts("NO") ;} const int manx=1e5+5;; int main() { string s; int n; cin>>n>>s; char c=s[0]; int cc=0; for(int i=1;i<n;i++) { if(c>s[i]){ put1(); cout<<cc+1<<" "<<i+1<<endl; return 0; } if(s[i]>c) c=s[i],cc=i; } put2(); return 0; }

B - Game with Telephone Numbers

思路:求能否赢只需要判断后十个数字以外的’8’的数量和其他数字的数量。 当8的数量大于其他的数量时,V赢;否则P赢。

#include<bits/stdc++.h> #define ll long long #define R register int #define inf 0x3f3f3f3f #define mod 1000000007; using namespace std; inline ll read(){ ll s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } void put1(){ puts("YES") ;} void put2(){ puts("NO") ;} const int manx=1e5+5;; int main() { string s; int n; cin>>n>>s; int a=0,b=0; for(int i=0;i<n-10;i++) if(s[i]=='8') a++; else b++; if(a>=b+1) put1(); else put2(); return 0; }

C - Alarm Clocks Everywhere

思路:给一个闹钟,要求在一定时间点能够响起,只需要求每个时间点减去第一次响的时间(即求她们的间隔)的最大公约数ans,这样保证每个时间点都可以响起来,然后遍历p数组如果存在一个数的倍数是ans,那么这个数就是答案。 例如 3 12 18 差值 9 15 最大公约数 3 那么只要一个数的倍数是3 那么这个数就可以转化成3 随后可以把3转换成 差值 9和15 3就可以变成12 18。 wa问题:没考虑倍数关系,第一次直接遍历p 当ans==p[i] 就输出了答案。

#include<bits/stdc++.h> #define ll long long #define R register int #define inf 0x3f3f3f3f #define mod 1000000007; using namespace std; inline ll read(){ ll s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } void put1(){ puts("YES") ;} void put2(){ puts("NO") ;} const int manx=3e5+5;; ll a[manx]; int main() { ll n,m; n=read(),m=read(); for(int i=1;i<=n;i++) a[i]=read(); ll y=a[1],flag=0,b; ll ans=0; for(int i=2;i<=n;i++) ans=__gcd(a[i]-a[1],ans); for(int i=1;i<=m;i++){ b=read(); if(ans%b==0) flag=i; //if(ans==b) wa了一发 } if(flag){ put1(); cout<<y<<" "<<flag<<endl; } else put2(); return 0; }

D - Beautiful Array

思路:简单dp,分三种情况,一种还没乘m ,一种正在乘m,一种已经乘m。 wa问题:求最小连续段和最大连续段,分情况整个子段*m,不知道为啥wa。

#include<bits/stdc++.h> #define ll long long #define R register int #define inf 0x3f3f3f3f #define mod 1000000007; using namespace std; inline ll read(){ ll s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } void put1(){ puts("YES") ;} void put2(){ puts("NO") ;} const int manx=3e5+5;; ll a[manx],dp[manx]; int main() { ll n,m,ans=-inf; n=read(),m=read(); for(int i=1;i<=n;i++){ a[i]=read(); dp[0]=max((ll)0,dp[0]+a[i]); dp[1]=max(dp[0],dp[1]+a[i]*m); dp[2]=max(dp[1],dp[2]+a[i]); ans=max(ans,dp[2]); } cout<<ans<<endl; return 0; }
最新回复(0)