Codeforces 无路可走
题目来源:
问题 - 2130B - Codeforces
这道题要求无论如何按照题目要求走都不能凑够s的数组,那么就分为三种情况:
1 当数组所有元素加起来大于s时
根据题目要求必须从下标1走到下标n可以得知,此时是绝对不能满足题意的,那么直接输出原数组即可
2 当数组所有元素加起来等于s时
只需要完整的走一遍就可以满足题目要求,此时不管如何排列都是不能阻止爱丽丝的,那么此时输出-1
3 当数组元素加起来小于s时
这个时候又分为两个情况
(1)当数组所有元素加起来只比s小1时,再回去看题目可以发现,数组中至少有1个0,1个1,1个2,我们只需要保证最后两个数字排列不是1和0即可,那么就采取最朴素的方式直接按顺序,先全部输出0,再全部输出2,最后全部输出。此时不管爱丽丝怎么走都会凑出比s大的数。
(2)当数组所有元素加起来比s至少小2时,那么这个时候,不管是怎么排列都无法阻止爱丽丝,由于题目中要求至少包含一个0,那么爱丽丝就可以采取0和旁边不为0的数字进行增加,直到凑够所有元素比s小的数值,再走到下标为n的数组即为完成
#include<bits/stdc++.h>
using namespace std;
int main()
{int t;cin>>t;while(t--){int n,s,sum=0;cin>>n>>s;vector<int>arr(n);int add[3];memset(add,0,sizeof(add));for(int i=0;i<n;i++){cin>>arr[i];if(arr[i]==0){add[0]++;}if(arr[i]==1){add[1]++;}if(arr[i]==2){add[2]++;}sum=sum+arr[i];}if(sum>s){for(int i=0;i<n;i++){cout<<arr[i]<<" ";}}else if(sum==s){cout<<"-1";}else{if(sum+2<=s){cout<<"-1";}else{for(int i=0;i<add[0];i++){cout<<"0 ";}for(int i=0;i<add[2];i++){cout<<"2 ";}for(int i=0;i<add[1];i++){cout<<"1 ";}}}cout<<endl;}return 0;}