codeforces Round #749
应lzd割割要求,现在补上b题
A windblume Ode
题意:找出子集的最大个数,使得子集的和是合数
题解:先求这个集合本身总和sum,若sum是合数,那么直接输出就可。若不是,说明sum是质数,质数除了2,都是奇数,那么这个sum一定会有一个奇数因子,我们减去这个奇数,就能得到一个偶数->也就是得到了一个合数(奇数+偶数=奇数)
代码:
# include <bits/stdc++.h>
using namespace std;
int a[300];
bool isprime (int x){
if (x < 2)
return false;
for (int i = 2; i <= x/i; i ++)
if (x % i == 0)
return false;
return true;
}
int main(){
int t;
cin >> t;
while (t --){
int n;
cin >> n;
int sum = 0;
for (int i = 1; i <= n; i ++){
cin >> a[i];
sum += a[i];
}
if (!isprime(sum)){
cout << n << endl;
for (int i = 1; i <= n; i ++)
cout << i << " ";
cout << endl;
}
else{
cout << n - 1 << endl;
for (int i = 1; i <= n; i ++){
if (a[i]%2!=0){
a[i] = 0;
break;
}
}
for (int i = 1; i <= n; i ++){
if (a[i])
cout << i << " ";
}
cout << endl;
}
}
return 0;
}
B. Omkar and Heavenly Tree
B 题链接
题意:要求输入的a,b,c,b不能在a,c之间的路径出现,而且要求树中每个点两两之间有满足限制条件可达的路径,并且不能一个点重复走。
题解:我们构造一个既然题意给的m组输入的m < n,那一定有一个点不会被施加限制,因此我们找到这个点,让他做根节点,让每个子节点先走根节点,然后通过根节点访问到其他子节点,大致如下图:a到b,可以a->root,再root->b

代码:
# include <iostream>
# include <string.h>
using namespace std;
const int N = 1e5 + 10;
bool st[N];
int main(){
int t;
cin >> t;
while (t --){
int n, m;
int a, b, c;
cin >> n >> m;
memset(st,0,sizeof(st));
for (int i = 1; i <= m; i ++){
cin >> a >> b >> c;
st[b] = true;
}
int k;
for (int i = 1; i <= n; i ++)
if (!st[i]){
k = i;
break;
}
for (int i = 1; i <= n; i ++){
if (i != k)
cout << i << " " << k << endl;
}
}
return 0;
}


浙公网安备 33010602011771号