ec round 92
B
根据贪心,答案必定取在在同一个位置左右横跳的情况。
这时候我们要注意z值与k值的大小关系,如果还在左右横跳的情况下,k值变为0,那么我们就要判断这时候跳到了左边还是右边;如果左右横跳z次数为0,k值不为0,那么我们只能再往右走。取其每种情况的最大值。
#include <bits/stdc++.h> #define debug freopen("r.txt","r",stdin) #define mp make_pair #define ri register int using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 1e6+10; const int INF = 0x3f3f3f3f; const int mod = 1e9+7; 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;} ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;} int t,n,k,z,i,w,a[maxn],ans,summ[maxn],sum[maxn],wei,m,ed,j; int main() { t=read(); while (t--) { n=read(),k=read(),z=read(); for (i=1;i<=n;i++) a[i]=read(); for (i=1;i<=n;i++) { summ[i]=summ[i-1]+a[i]; } for (i=1;i<n;i++)sum[i]=a[i]+a[i+1]; ans=summ[k+1]; wei=k+1; for (i=1;i<=z;i++) { wei-=2; m=-1; if(wei<1) break; for (j=1;j<=wei;j++) m=max(m,sum[j]); ans=max(summ[wei]+m*i,ans); } cout<<ans<<endl; } return 0; }
C
根据数据可以分析得到,只能是两个值交替出现的时候才能符合题目条件,如 xyxyxyxyxy ,左移一位为 yxyxyxyxyx,右移一位为 yxyxyxyxyx,相等。要注意这种 xyxyxyxyx ,缺少出现一个 y 的情况,左移右移是不相等的。
如果在 x==y 的情况下,无论多少个,左移右移都能相等。
#include <bits/stdc++.h> #define debug freopen("r.txt","r",stdin) #define mp make_pair #define ri register int using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 1e6+10; const int INF = 0x3f3f3f3f; const int mod = 1e9+7; 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;} ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;} int i,len,j,l,t,maxx,sum; char s[maxn]; int main() { t=read(); while (t--) { scanf("%s",s+1); len=strlen(s+1); maxx=0; for (i=0;i<=9;i++) for (j=0;j<=9;j++) { sum=0; for (l=1;l<=len;l++) if ((s[l]-'0')==i && sum%2==0) sum++; else if ((s[l]-'0')==j && sum%2==1) sum++; if (i==j) maxx=max(sum,maxx); else if (sum%2==0) maxx=max(sum,maxx); } cout<<len-maxx<<endl; } return 0; }
D
如果两个线段本身有交集,那么需要计算是否增长线段长度。如果要,那么我们一开始增长+1,交集+1,把所有组的线段都进行这样的处理,如果还没有符合题目条件,再决定是否要增长+2,交集+1
如果两个线段本身无交集,我们肯定要先让第一组线段有交集,一开始增长+1,交集+1,但是到了完全重合的时候,我们要增长+2,才能交集+1,只是这样做可能会取不到最优值。因此,我们可以试着选用下一组线段再次进行如此操作,先让线段有交集,再增长+1,交集+1,两者进行比较,取最优即可。
代码写太长没调出来……,这种模拟题一定要思路清晰。

浙公网安备 33010602011771号