3 条题解
-
2
思路就是先前n+m个按规则分配,你会发现你少一个人那就是把第n+m+1那个人加上把第i个人删了就行,所以要预处理n+m个人,如果大家判断第i个是程序员或者测试员,然后直接删了他,把第n+m+1这个人顶替他的位置其实就漏了一种情况了,就是n个程序员选出来了了,然后后面有一个人适合做程序员也只能做测试员了,然后你删了一个程序员,是不是可以将原来的这个测试员派到程序员那里,细节1只有这种情况,那就好处理了,只要判断程序员人数够时后面第一个适合做程序员这个人的位置,和测试员人数够时后面第一个适合做测试员这个人的位置,有一个错误就是n或者m本来就是0时就不用找了,所以特判n或者m是0的情况,是0 就让他是-1,然后找找,(应该会)再开2个数组,用来标记第i个人是程序员还是测试员,然后就可以遍历了如果这个人是程序员而且存在后面适合当程序员的但是没有当上程序员的人k那就是把第i个人的值减了,再减去第k个人当测试员的值,加上第k个人当程序员的值然后把第n+m+1这个人当测试员的值,(简单来说就是把第i个人删了,把第k个人换成程序员然后把第n+m+1个人当测试员加上去就行了),第i个人是测试员操作一样。
#include<bits/stdc++.h> using namespace std; #define int long long void sll() { int n,m; cin>>n>>m; int arr[n+m+10]={0}; int brr[n+m+10]={0}; int gs=m+n+1; for(int i=1;i<=gs;i++) { cin>>arr[i]; } for(int i=1;i<=gs;i++) { cin>>brr[i]; } if(n==0) { n=-1; } if(m==0) { m=-1; } int t=0; int pp1[n+m+10]={0}; int pp2[n+m+10]={0}; int kk1=0; int kk2=0; for(int i=1;i<gs;i++) { if(n==0&&arr[i]>brr[i]&&kk1==0) { kk1=i; } if(m==0&&brr[i]>arr[i]&&kk2==0) { kk2=i; } if(arr[i]>brr[i]&&n>0) { n--; t+=arr[i]; pp1[i]=1; } else if(m>0) { m--; t+=brr[i]; pp2[i]=1; } else { pp1[i]=1; n--; t+=arr[i]; } } int a=arr[gs]; int b=brr[gs]; for(int i=1;i<gs;i++) { if(pp1[i]==1) { if(kk1==0) { cout<<t-arr[i]+a<<' '; } else { cout<<t-arr[i]-brr[kk1]+arr[kk1]+b<<' '; } } else { if(kk2==0) { cout<<t-brr[i]+b<<' '; } else { cout<<t-brr[i]-arr[kk2]+brr[kk2]+a<<' '; } } } cout<<t<<'\n'; } signed main() { ios::sync_with_stdio(0); cout.tie(0),cin.tie(0); int cs=1; cin>>cs; while(cs--) { sll(); } return 0; }
信息
- ID
- 1204
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 11
- 已通过
- 1
- 上传者