题目
Description
给定一个长度为n的序列a,请将其重新排序,新序列中任意相邻两个数之和都不能被3整除。
Format
Input
第一行有一个整数,表示序列的长度n。 第二行有n个整数,第i个整数表示序列的第i个元素a_i
Output
如果存在解,请在第一行输出一行一个字符串Yes 如果无解,请只输出一行一个字符串No。
Samples
输入数据 1
3
1 2 3
Copy
输出数据 1
Yes
Copy
Limitation
1s, 1024KiB for each test case.
思路:
这道题主要采用分类讨论的思想;
首先,我们知道,两个数除以3的余数相,加为3的倍数,那这两个数一定是3的倍数;
那我们就不能吧2个余数为0的数,或把余数为1和2的2个数放到一起;
代码实现:
#include <bits/stdc++.h>
using namespace std;
int n, a[3];//数组a用来储存除以三的余数 :0,1,2
int main() {
cin >> n;
int b[n + 2];
for (int i = 1; i <= n; i++) {
cin >> b[i];
a[b[i] % 3]++;
}
if (a[0] == n) //如果全是3的倍数
cout << "No";
else if (a[1] == n || a[2] == n)//否则,如果余数全是1或2
cout << "Yes";
else if (a[1] == 0) {//否则,如果余数全是2和0
if (a[0] - a[2] <= 1) //余数是0的个数大最多比余数是2的个数多一个
cout << "Yes";
else
cout << "No";
} else if (a[2] == 0) {//否则,如果,如果余数全是1和0
if (a[0] - a[1] <= 1)//余数是0的个数大最多比余数是1的个数多一个
cout << "Yes";
else
cout << "No";
} else if (a[0] == 0) {//否则,如果余数全是1和2
cout << "No";
} else if (a[1] != 0 && a[2] != 0 && a[0 != 0]) {//否则,如果,如果全都有
if ((a[2] + a[1]) >= a[0])//余数是1和2的个数必须比余数是0的个数多
cout << "Yes";
else {
if (a[0] - a[1] - a[2] <= 1)
cout << "Yes";
else
cout << "No";
}
}
return 0;
}
好了,这道题就ak了,希望大家多多三连支持一下