专栏文章
题解:CF2130B Pathless
CF2130B题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miol7d2y
- 此快照首次捕获于
- 2025/12/02 21:01 3 个月前
- 此快照最后确认于
- 2025/12/02 21:01 3 个月前
题意
组数据,每组数据给定一个长度为 的数组 和一个非负整数 ,从 开始,向左或向右 步任意次,并使 加上 ,直至到达 ,问是否有一种排列使得无论怎样移动都无法使 ,若有,输出任意一种即可,否则输出 。
思路
我们可以在输入时便记录 以及 ,, 的个数,然后令 。当 或 时,我们就可以先输出完所有的 ,再输出完所有的 ,最后输出剩下的 ;否则直接输出 。
证明
已知 ,令 ,那么这里我们分 种情况进行讨论:
- :说明哪怕我全程只走一次都会导致 ,如果我还来回走显然 会更小,因此在该情况下任意排列均正确。
- :说明 ,那么我全程只要有一个 和 相邻,来回走一下,就会使 ,因此,我们就要让 和 分隔开,故先输出所有的 ,再输出所有的 ,最后输出所有的 即可使得无论如何都满足 。
- 或 :那么此时无论我怎么进行排列,总会有 ,, 之间存在相邻,那么进而我就可以得到 ,,,然后就可以通过任意个 ,, 的组合得到任意大于等于 的数,显然就无解了,此时输出 即可。
综上所述,当 或 时,我们可以通过先输出所有的 ,再输出所有的 ,最后输出所有的 即为正确答案,而当 或 时,直接输出 即可,证毕。
Code
CPP#include<bits/stdc++.h>
#define endl "\n"
#define ll long long
#define N 1006
using namespace std;
int t,n,s,a[N],sum;
int mp[N];//mp记录0,1,2的个数
inline int read();
int main(){
t=read();
while(t--){
memset(mp,0,sizeof(mp));//多测不清空,亲人两行泪
sum=0;
n=read();s=read();
for(int i=1;i<=n;i++) a[i]=read(),mp[a[i]]++,sum+=a[i];
s-=sum;
if(s==1 || s<0){
for(int i=1;i<=mp[0];i++) cout<<0<<" ";
for(int i=1;i<=mp[2];i++) cout<<2<<" ";
for(int i=1;i<=mp[1];i++) cout<<1<<" ";
cout<<endl;
}else cout<<-1<<endl;
}
return 0;
}
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-48;ch=getchar();}
return x*f;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...