Codeforces Round #585 (Div. 2) CF1215A~C
CF1215A. Yellow Cards简单的模拟,给定了黄票张数,判断最少和最多有多少人被罚下场。
#include <bits/stdc++.h> using namespace std; int main() { int a,b,aa,bb,n,nnn; cin>>a>>b>>aa>>bb>>n; nnn=n; int t=(aa-1)*a+(bb-1)*b; int tt=0; if(aa<=bb) { if(n>=aa*a) { tt+=a; n-=aa*a; } else { tt+=n/aa; int o=n/aa; n-=o*aa; } if(n>=bb*b) { tt+=b; n-=bb*b; } else { tt+=n/bb; int o=n/bb; n-=o*bb; } } else { if(n>=bb*b) { tt+=b; n-=bb*b; } else { tt+=n/bb; int o=n/bb; n-=o*bb; } if(n>=aa*a) { tt+=a; n-=aa*a; } else { tt+=n/aa; int o=n/aa; n-=o*aa; } } if(t>=nnn) { cout<<"0 "<<tt<<endl; } else { cout<<min(nnn-t,a+b)<<" "<<tt<<endl; } return 0; }
CF1215B. The Number of Products,我们以第一位数到最后一位数的乘积来分析,1-n的状态数分别是n n-1 n-2……1。
观察易得减少一个正数时,正数的状态-1,减少一个负数时,负数的状态数-1,并正负状态交换,即可O(n)递推求出答案
#include <bits/stdc++.h> using namespace std; int a[2000005]; typedef long long ll; int main() { int n; cin>>n; ll l=0,r=0; ll tt=1; for(int i=1;i<=n;++i) { ll t; cin>>t; if(t>0) { a[i]=1; } else { a[i]=-1; } tt*=a[i]; if(tt>0) { l++; } else { r++; } } ll al=l,ar=r; for(int i=2;i<=n;++i) { if(a[i-1]>0) { l--; } else { r--; swap(l,r); } al+=l; ar+=r; } cout<<ar<<" "<<al; return 0; }
CF1215C. Swap Letters 首先只有ab和ba出现的次数为奇数不成立,其余时候ab\ba可和ab\ba一次配对,ab和ba需要两次这里我用了vecotr来避免重复使用
#include <bits/stdc++.h> using namespace std; typedef long long ll; vector<int>vt1; vector<int>vt2; int main() { int n,aaa=0; cin>>n; string str1,str2; cin>>str1>>str2; int flag=0; for(int i=0;i<str1.size();++i) { if(str1[i]=='a'&&str2[i]=='a') { flag++; } if(str1[i]=='b'&&str2[i]=='b') { flag++; } } flag=n-flag; if(flag%2!=0) { cout<<-1; return 0; } for(int i=0;i<str1.size();++i) { if(str1[i]=='a'&&str2[i]=='b') { vt1.push_back(i); } if(str2[i]=='a'&&str1[i]=='b') { vt2.push_back(i); } } for(int i=vt1.size()-1;i>=0;i-=2) { int j=i-1; if(j>=0) { aaa++; vt1.pop_back(); vt1.pop_back(); } } for(int i=vt2.size()-1;i>=0;i-=2) { int j=i-1; if(j>=0) { aaa++; vt2.pop_back(); vt2.pop_back(); } } if(vt1.size()) { int i=vt1.size()-1; int j=vt2.size()-1; aaa++; aaa++; } cout<<aaa<<endl; vt1.clear(); vt2.clear(); for(int i=0;i<str1.size();++i) { if(str1[i]=='a'&&str2[i]=='b') { vt1.push_back(i); } if(str2[i]=='a'&&str1[i]=='b') { vt2.push_back(i); } } for(int i=vt1.size()-1;i>=0;i-=2) { int j=i-1; if(j>=0) { cout<<vt1[j]+1<<" "<<vt1[i]+1<<endl; vt1.pop_back(); vt1.pop_back(); } } for(int i=vt2.size()-1;i>=0;i-=2) { int j=i-1; if(j>=0) { cout<<vt2[j]+1<<" "<<vt2[i]+1<<endl; vt2.pop_back(); vt2.pop_back(); } } if(vt1.size()) { int i=vt1.size()-1; int j=vt2.size()-1; cout<<vt1[i]+1<<" "<<vt1[i]+1<<endl; cout<<vt1[i]+1<<" "<<vt2[j]+1<<endl; } return 0; }