Codeforces Round #436 (Div. 2)
Posted walfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #436 (Div. 2)相关的知识,希望对你有一定的参考价值。
A:n个数,看能不能找出只有两种数,而且数量相同
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pair<int,int> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=1000+10,maxn=60000+10,inf=0x3f3f3f; inline void debug(){cout<<"fuck"<<endl;} map<int,int>m; int a[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; m[a[i]]++; } sort(a,a+n); if(m.size()!=2)cout<<"NO"<<endl; else { if(m[a[0]]==m[a[n-1]])cout<<"YES"<<endl<<a[0]<<" "<<a[n-1]<<endl; else cout<<"NO"<<endl; } return 0; } /******************** ********************/
B:一个字符串,找最长连续的小写字母里面的小写字母种数,暴力查找
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pair<int,int> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=1000+10,maxn=60000+10,inf=0x3f3f3f; inline void debug(){cout<<"fuck"<<endl;} map<char,int>m; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; string s; cin>>n>>s; int ans=0; for(int i=0;i<s.size();i++) { m.clear(); for(int j=i;j<s.size();j++) { if(‘A‘<=s[j]&&s[j]<=‘Z‘)break; m[s[j]]++; } ans=max(ans,(int)m.size()); } cout<<ans<<endl; return 0; } /******************** ********************/
C:sb模拟题,边界情况没考虑,我的做法要特判k==1的情况,每次更新到下一个加油站,看能不能不加油
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pair<int,int> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=1000+10,maxn=60000+10,inf=0x3f3f3f; inline void debug(){cout<<"fuck"<<endl;} int main() { ios::sync_with_stdio(false); cin.tie(0); ll a,b,f,k; cin>>a>>b>>f>>k; if(k==1&&(b<f||b<a-f)) { cout<<-1<<endl; return 0; } ll ans=0,now=b-f; if(now<0) { cout<<-1<<endl; return 0; } for(int i=1;i<k;i++) { if(i%2==1) { if(now<2*(a-f))now=b,ans++; now-=2*(a-f); } else { if(now<2*f)now=b,ans++; now-=2*f; } if(now<0) { cout<<-1<<endl; return 0; } } if(k%2==1) { if(now<a-f)ans++; } else { if(now<f)ans++; } cout<<ans<<endl; return 0; } /******************** ********************/
D:找改变次数最小且字典序最小的置换,先记录所有的没有出现过的加入队列,循环,对于某一个点(有多个没有改变的)如果还没有确定的点,而且它的值小于队列头的值,那么把它确定下来,否则就给他赋值,可以保证最后结果字典序最小
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pair<int,int> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=200000+10,maxn=60000+10,inf=0x3f3f3f; int num[N],a[N]; bool vis[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n,ans=0; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; num[a[i]]++; } queue<int>q; for(int i=1;i<=n;i++) if(!num[i]) q.push(i); memset(vis,0,sizeof vis); for(int i=1;i<=n;i++) { if(num[a[i]]>1) { if(!vis[a[i]]&&a[i]<q.front()) { vis[a[i]]=1; } else { ans++; num[a[i]]--; a[i]=q.front(); q.pop(); } } } cout<<ans<<endl; for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; return 0; } /******************** ********************/
E:对于这一题,可以先想到怎么求最大的价值,先对结束时间排序,然后dp扫一遍,不是多重背包,所以从后往前扫。
记录路径可以用一个二维数组,所有挑选的位置就定义为true,对于找出最后的答案,可以从后往前扫求出最大的那一个标号id,然后每次找到id对应的i时就改变id,使它跳转到上一个更新的路径,然后不断放入栈中,最后输出
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pair<int,int> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=100+10,maxn=2000+10,inf=0x3f3f3f; struct item{ int savetime,burntime,value; int index; }a[N]; int dp[maxn]; bool pre[N][maxn]; bool comp(item a,item b) { return a.burntime<b.burntime; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i].savetime>>a[i].burntime>>a[i].value; a[i].index=i; } sort(a+1,a+1+n,comp); memset(dp,0,sizeof dp); for(int i=1;i<=n;i++) { for(int j=a[i].burntime-1;j>=a[i].savetime;j--) { if(dp[j]<dp[j-a[i].savetime]+a[i].value) { dp[j]=dp[j-a[i].savetime]+a[i].value; pre[i][j]=1; } } } int ans=-1,id=0; for(int i=0;i<=2000;i++) { if(ans<dp[i]) { ans=dp[i]; id=i; } } cout<<ans<<endl; stack<int>s; for(int i=n;i>=1;i--) { if(pre[i][id]) { id-=a[i].savetime; s.push(a[i].index); } } cout<<s.size()<<endl; while(!s.empty()) { cout<<s.top()<<" "; s.pop(); } cout<<endl; return 0; } /******************** 5 12 1 17 10 1 11 16 4 50 17 5 5 6 1 2 dp[j]=max(dp[j-1],dp[j-a[i].savetime]+a[i].value) ********************/
以上是关于Codeforces Round #436 (Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #436 (Div. 2)
[Codeforces] Round #436 (Div. 2)