A
2 个集合分别有 n个数字
交换a b中的 数字 使得2个集合中数字数目一样
直接模拟
#include <iostream> #include<string.h> #include<stdio.h> #include<algorithm> #include<string> using namespace std ; #define LL long long #define MAXN 500010 int s1[6],s2[6]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int a; scanf("%d",&a); s1[a]++; } for(int i=1;i<=n;i++) { int a; scanf("%d",&a); s2[a]++; } int ok=0; for(int i=1;i<=5;i++) { if((s1[i]+s2[i])%2==1) ok=1; } if(ok==1) printf("-1 "); else { int ans=0; for(int i=1;i<=5;i++) { if(s1[i]<s2[i]) { // printf("%d %d %d ",s1[i],s2[i],ans); int a=(s2[i]-s1[i])/2; ans=ans+a; s1[i]=s2[i]=s1[i]+a; //printf("%d %d %d ",s1[i],s2[i],ans); int j=i+1; while(a>0) { while(s1[j]>s2[j]&&a>0) { a--; //printf("%d ",a); // printf("%d %d ",s1[j],s2[j]); s1[j]--; s2[j]++; // printf("%d %d ",s1[j],s2[j]); } j++; } } else if(s1[i]>s2[i]) { // printf("%d %d %d ",s1[i],s2[i],ans); int a=(s1[i]-s2[i])/2; ans=ans+a; s1[i]=s2[i]=s2[i]+a; // printf("%d ",ans); int j=i+1; while(a>0) { while(s1[j]<s2[j]&&a>0) { a--; s2[j]--; s1[j]++; } j++; } } } printf("%d ",ans); } return 0; }
B
删掉一些数字 使他能被 10^k 整除
最少删除几个数字
从后往前 把不是0的数字删掉 然后计数0
题目说肯定有解
#include <iostream> #include<string.h> #include<stdio.h> #include<algorithm> #include<string> using namespace std ; #define LL long long #define MAXN 500010 int dig[15]; int main() { int n,k,m; scanf("%d%d",&n,&k); int len=0; m=n; while(n) { dig[++len]=n%10; n=n/10; } if(m==0) printf("0 "); else { int cnt=0,num=0; int ok=0; for(int i=1;i<=len;i++) { if(dig[i]==0) num++; else cnt++; if(num==k) { ok=1; break; } } if(ok==1) printf("%d ",cnt); else { printf("%d ",len-1); } } return 0; }
C
n 个物品 立刻要至少买 k 个 物品 降价前的价格和降价后的价格
显然 后面要升价的物品 怎么样都要先买 然后降价后的再买
根据 价格的差排序
#include <iostream> #include<string.h> #include<stdio.h> #include<algorithm> #include<string> using namespace std ; #define LL long long #define MAXN 200010 struct item { int a,b,w; }it[MAXN]; bool cmp(item a, item b) { return a.w>b.w; } int main() { int n,k; scanf("%d%d",&n,&k); for(int i=0;i<n;i++) scanf("%d",&it[i].a); for(int i=0;i<n;i++) { scanf("%d",&it[i].b); it[i].w=it[i].b-it[i].a; } sort(it,it+n,cmp); int ans=0; for(int i=0;i<n;i++) { if(i<k) { ans=ans+it[i].a; } else if(it[i].w>0) ans=ans+it[i].a; else ans=ans+it[i].b; } printf("%d ",ans); return 0; }