1 条题解
-
0
自动搬运
来自洛谷,原作者为

Erinyes
压力诺?搬运于
2025-08-24 22:37:39,当前版本为作者最后更新于2022-04-12 16:08:37,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
来自出题人的题解。
这道题我们采用分类讨论的思想。
:
当 时,一定可以实现。
当 时,如果不是其中一个为 ,就不能实现。
if(n==1) puts("YES"); if(n==2){ if(a[1]==0 || a[2]==0) puts("YES"); else puts("NO"); }:
我们可以将这个数列表示为 。
首先将这个数列升序排序。
那么就可以将三个数变成 和另外两个数。
具体过程:
将 和 对 执行 次操作,即可得到:
假如剩下的数为 。
我们将 和 各减去 ,再将 加上 ,就会变成 。
再将 和 对 执行两次操作,就会变成 。
由此在不改变 为 的情况下,每次可以将 减去 ,再将 加上 。
-
如果 为 ,则最后肯定可以使 变成 ,并把 变成 。
-
如果 不为 ,那么肯定可以使用刚才的方式将原数列变为:
这里的 表示为操作完的 值,对结果不影响。
或者
当数列是 时,我们可以将 和 对 进行一次操作,将数列变为:
这时,若 为 ,则可以像之前的方法将 和 进行操作,所以可以。
当数列是 时,我们也可以将数列变为:
这时,若 为 ,则可以像之前的方法将 和 进行操作,所以可以。
上面两种方法一个满足 为 且 为 ,另一个满足 为 且 为 ,总结出来就是 不为 。
所以当满足上述条件之一是时一定可以实现,否则不行。
注意: 和 可以互换
if(n==3){ sort(a+1,a+n+1); a[3]+=a[1]*2; a[2]-=a[1]; a[1]=0; if(a[2]%3==0 || a[3]%3==0) puts("YES"); else if((a[2]%3==1 && a[3]%3==1) || (a[3]%3==1 && a[2]%3==1)) puts("YES"); else if((a[2]%3==2 && a[3]%3==2) || (a[3]%3==2 && a[2]%3==2)) puts("YES"); else puts("NO"); }:
对于这种情况,我们可以用类似于 的方法将数列变成 。
具体方法:先对整个序列进行升序排序,然后对于每一个 ,可以将 和 对 进行 次操作,将 变成 。
转换完后,我们可以先将 和 对第一个 和第二个 各进行一次操作,将序列变成:
然后我们再将两个 对 进行两次操作,将序列变成:
所以我们可以在不改变前面两个 的情况下,将 减去 ,并将 加上 。
由于我们在 的情况下已经证明了可以将 减去 ,并将 加上 ,所以问题就转化成了每次可以将 减去 或 ,问能不能将 减到 。
-
当 为 时,直接进行 次减 操作。
-
当 为 时,先进行一次减 操作,再进行 次减 操作。
按照以上的推论,当 时,是一定能实现的,但如果我们要进行减 操作, 必须要大于等于 ,所以需要特殊考虑。
-
:将 和 对另一个 进行一次操作即可。
-
: 进行不了操作,并且将 进行减 操作时 会减到负数去,所以这个特例是不能实现的。
-
:同 ,两次操作即可。
同样的,如果我们要进行减 操作, 必须要大于等于 ,也需要特殊考虑。
-
:将 和 对一个 进行一次操作,再将得到的 和 对剩下一个 进行两次操作即可。
-
:将 进行一次减 操作即可。
-
:同 ,进行三次操作。
综上,当原数列排序后不为 时,就可以实现,否则不行。
:
当 时,也可以用类似的方法将原数列变为 的形式,然后按照 时的操作方法进行操作,所以类似的,当原数列排序后不为 时一定可以实现,否则不行。
其实我们没必要排序,只用统计 出现的次数即可。
if(n>=4){ int cnt0=0,cnt1=0,cnt2=0; for(int i=1;i<=n;i++){ if(a[i]==0) cnt0++; else if(a[i]==1) cnt1++; else if(a[i]==2) cnt2++; } if(cnt0==n-2 && cnt1==1 && cnt2==1) puts("NO"); else puts("YES"); }Code:
#include<bits/stdc++.h> #define maxn 100005 using namespace std; int n,a[maxn]; int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",a+i); if(n==1) puts("YES"); if(n==2){ if(a[1]==0 || a[2]==0) puts("YES"); else puts("NO"); } if(n==3){ sort(a+1,a+n+1); a[3]+=a[1]*2; a[2]-=a[1]; a[1]=0; if(a[2]%3==0 || a[3]%3==0) puts("YES"); else if((a[2]%3==1 && a[3]%3==1) || (a[3]%3==1 && a[2]%3==1)) puts("YES"); else if((a[2]%3==2 && a[3]%3==2) || (a[3]%3==2 && a[2]%3==2)) puts("YES"); else puts("NO"); } if(n>=4){ int cnt0=0,cnt1=0,cnt2=0; for(int i=1;i<=n;i++){ if(a[i]==0) cnt0++; else if(a[i]==1) cnt1++; else if(a[i]==2) cnt2++; } if(cnt0==n-2 && cnt1==1 && cnt2==1) puts("NO"); else puts("YES"); } } getchar(); getchar(); return 0; } -
- 1
信息
- ID
- 7512
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者