codeforces Round #749

应lzd割割要求,现在补上b题

A windblume Ode

A 题链接

题意:找出子集的最大个数,使得子集的和是合数
题解:先求这个集合本身总和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;
}
posted @ 2021-10-22 11:42  Gsding  阅读(42)  评论(0)    收藏  举报