Codeforces Round #402 (Div. 2)
没补完。。。
题意:交换a、b数组中的值,使a、b中每个数值得数量相同
统计a、b数组中每个数值得个数,用ai表示数组a中含 i 的个数
if(ai+bi是奇数) 那么无论怎么交换,a、b中i的数量都不一样,输出-1;
else | ai-bi | /2 表示数值 i 要从一个数组移动到另一个数组的个数
#include<bits/stdc++.h> using namespace std; int a[10]={0},b[10]={0}; int n,c; int main(){ cin>>n; for(int i=0;i<n;i++){ cin>>c; a[c]++; } for(int i=0;i<n;i++){ cin>>c; b[c]++; } int cnt=0; for(int i=1;i<=5;i++){ if((a[i]+b[i])%2){ cout<<"-1 "; return 0; } else{ c=a[i]-b[i]; if(c<0) c=-c; cnt+=c/2; } } cout<<cnt/2<<" "; return 0; }
题意: 给你一个数n,求该数删掉多少个数后,使得n%1ek==0
从最后一个非0数开始删
#include<bits/stdc++.h> using namespace std; char str[100]; int k; int main(){ cin>>str>>k; int l=strlen(str); int cnt=0; while(l-cnt>=k){ bool flag=true; int ans=0; for(int i=1;i<=k;i++){ if(str[l-cnt-i]!='0'){ flag=false; //cout<<l-cnt-i<<".. "; str[l-cnt-i]='0'; ans++; } } cnt+=ans; if(flag) break; } if(l-cnt>=k)cout<<cnt<<" "; else cout<<l-1<<" "; return 0; }
题意:有n个商品,第一周 i 商品价格为ai ,第二周价格为 bi,但是第一周必须买k个商品,求买下n个商品的最小花费
贪心:第一周买的k个商品,首先选ai<bi的商品,然后选ai和bi差距小的;
按ai-bi从小到大排序,取前k个的a,后面的选min(ai,bi)
#include<bits/stdc++.h> using namespace std; const int N=2e6+100; typedef long long ll; int n,k,c; struct node{ int a,b; }nd[N]; bool cmp(node x,node y){ return x.a-x.b<y.a-y.b; } int main(){ cin>>n>>k; for(int i=0;i<n;i++){ cin>>c; nd[i].a=c; } for(int i=0;i<n;i++){ cin>>c; nd[i].b=c; } sort(nd,nd+n,cmp); ll res=0; for(int i=0;i<k;i++){ res=res+(ll) nd[i].a; } for(int i=k;i<n;i++){ res=res+(ll)min(nd[i].a,nd[i].b); } cout<<res<<" "; return 0; }
题意: 给你两个字符串s1、s2,按所给数组a,依次删掉s1 ai位置上的字母,但是要保证s1中含有s2,求最多能删多少个
二分删除的个数。
#include<bits/stdc++.h> using namespace std; const int N=1e6; string s1,s2; int a[N]; bool solve(int n){ string s3=s1; for(int i=0;i<n;i++){ s3[a[i]-1]='*'; } int j=0; for(int i=0;i<s3.length();i++){ if(s3[i]==s2[j]){ j++; } if(j==s2.length()) return true; } return false; } int main(){ cin>>s1>>s2; for(int i=0;i<s1.length();i++){ cin>>a[i]; } int l=0,r=s1.length(),mid; while(l<=r){ mid=(l+r)/2; if(solve(mid)) l=mid+1; else r=mid-1; } cout<<r<<" "; return 0; }