Codeforces Round #621 (Div. 1 + Div. 2) 题解
Posted overrate-wsj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #621 (Div. 1 + Div. 2) 题解相关的知识,希望对你有一定的参考价值。
A. Cow and Haybales
思路:
在任何时候,最理想的做法是将最近的一堆草垛从桩1移到左侧。 因此,每天,我们都可以从左到右遍历一堆桩,并将我们看到的第一个草垛移近。 如果某个时候所有干草捆都堆放在第1堆中,我们可以早点停下来
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<stack> #include<iostream> 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; } const int manx=1e5+5; ll a[manx]; int main() { ll kk=read(); while(kk--) { ll n,m; scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++) cin>>a[i]; ll kkk=0; for(int i=2;i<=n;i++){ if(!a[i]) continue; if(m>=(i-1)){ ll res=m/(i-1); if(a[i]<res) m-=a[i]*(i-1),kkk+=a[i]; else m%=(i-1),kkk+=res; } else break; } cout<<a[1]+kkk<<endl; } return 0; }
B. Cow and Friend
思路:
如果最喜欢的数字里包含x那么答案就为1
否则,设能跳的最远距离为max,如果max大于x的话那么答案就为2,如果小于x的话答案就为(x/max)向上取整
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn=1e5+10; int a[maxn]; int main() { int yy; cin>>yy; while(yy--){ int n,x; scanf("%d%d",&n,&x); int k=0,fla=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); if(a[i]<=x){ k=max(a[i],k); } if(a[i]>x){ fla=1; } } if(fla&&k!=x){ cout<<2<<endl; continue; } if(!(x%k)) cout<<x/k<<endl; else cout<<(x/k+1)<<endl; } }
C. Cow and Message
思路:
由于有等差数列这个限制,所以两个以上字母的组合是肯定没有两个字母组合更有,因此我们只要枚举26*26个字母的组合看看哪种组合的出现次数最多即可,注意两个相同数字的组合也有可能是最大的
#include<bits/stdc++.h> #define ll long long using namespace std; #define maxn 100010 ll letter[maxn][30],vis[30][30],hz[30]={0},cnt[30]={0}; int main() { memset(vis,0, sizeof(vis)); memset(letter,0, sizeof(letter)); string s; cin>>s; int n=s.length(); for (int i = 0; i <n ; ++i) { if(i>0){ for (int j = 0; j <26 ; ++j) { letter[i][j]=letter[i-1][j]; } } letter[i][s[i]-‘a‘]++; cnt[s[i]-‘a‘]++; } for (int k = 0; k <n-1 ; ++k) { for (int i = 0; i <26 ; ++i) { hz[i]=letter[n-1][i]-letter[k][i]; vis[s[k]-‘a‘][i]+=hz[i]; } } ll kk=0; for (int l = 0; l <26 ; ++l) { for (int i = 0; i <26 ; ++i) { if(vis[l][i]>kk) kk=vis[l][i]; } } for (int m = 0; m <26 ; ++m) { if(cnt[m]>kk) kk=cnt[m]; } cout<<kk<<endl; return 0; }
以上是关于Codeforces Round #621 (Div. 1 + Div. 2) 题解的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #621 (Div. 1 + Div. 2) 题解
Codeforces Round #621 (Div. 1 + Div. 2)D dij(思维)
Codeforces Round #621 (Div. 1 + Div. 2)A-C简单记录
Codeforces Round #621 (Div. 1 + Div. 2) D