Codeforces Round #660 (Div. 2) A~C

目录

A. Captain Flint and Crew Recruitment

B. Captain Flint and a Long Voyage

C. Uncle Bogdan and Country Happiness


A. Captain Flint and Crew Recruitment

Codeforces Round #660 (Div. 2) A~C_第1张图片

 思路:

比较小的前几个类素数: 6  10  14  15  21 

挑选三个类素数,如果第四个素数和前三个重复则不满足条件,可以对其中的一个类素数进行调整,使得第四个数成为类素数;

#include

using namespace std;
//#define PII pair 
//const int N =1e5+10;
//int a[N];
//unordered_map mp;
int main()
{
	int t;
	cin >>t;
	while(t--)
	{
		int n;
		cin >>n;
		int x=n-6-10-14;
		if(x<=0)
		{
			puts("NO");
			continue;
		}
		puts("YES");
		if(x==6) printf("6 10 15 5\n");
		else if(x==10) printf("6 10 21 3\n");
		else if(x==14) printf("6 10 13 15\n");
		else printf("6 10 14 %d\n",x); 
	}
}

B. Captain Flint and a Long Voyage

Codeforces Round #660 (Div. 2) A~C_第2张图片

 思路:

 模拟一下前几个,就能找到规律;首先要确保去掉后n个数以后上下的值最大,那么原本的字符串必须最长;所以每一位必须是9或者8;因为 9  —— 1001    8——1000;所以当去掉的位数x<4时,最后一位一定是8;同理若x>=4,那么每个四位二进制代表的一定是8,一共有x/4个;

#include

using namespace std;
//#define PII pair 
//const int N =1e5+10;
//int a[N];
//unordered_map mp;
int main()
{
	int t;
	cin >>t;
	while(t--)
	{
		int n;
		cin >>n;
		int cnt=n%4==0?n/4:n/4+1;
		for(int i=1;i<=n;i++) cout <<(i>n-cnt?8:9);
		cout <

C. Uncle Bogdan and Country Happiness

Codeforces Round #660 (Div. 2) A~C_第3张图片Codeforces Round #660 (Div. 2) A~C_第4张图片

 思路:

 对任何一个节点u来说,设经过节点心情好的人为x,心情坏的人为y,经过节点的总人数为sum。则

  • x + y = size[u]         (size[u]为以u为根节点的子树的所有居民数量,也就是经过点u的人数)
  • x - y = h[u]

 由此可得,x= ( size[u] + h[u] ) / 2

同时,h[u] 和 size[u]的奇偶性必须相同;  

由于一个人的心情在由好变坏之后只能一直坏心情,所以父节点的心情好的人数一定大于子节点心情好的人数;

从根节点1开始往下dfs即可,对于每个节点判断是否满足以上条件;

#include 
using namespace std;
const int N=1e5+7;
int h[N],p[N],siz[N],b[N],f;
vector g[N];
void dfs(int v,int fa)
{
	siz[v]=p[v];
	for(int i=0;isiz[v]) f=1;
	int x=(h[v]+siz[v])/2;
	if(b[v]>x) f=1;
	b[v]=x;
	if(f) return ;
}
int main()
{
	int t;
	cin >>t;
	while(t--)
	{
		f=0;
		int n,m;
		cin >>n>>m;
		for(int i=1;i<=n;i++) h[i]=p[i]=siz[i]=b[i]=0,g[i].clear();
		for(int i=1;i<=n;i++) cin >>p[i];
		for(int i=1;i<=n;i++) cin >>h[i];
		for(int i=1;i<=n-1;i++)
		{
			int x,y;
			cin >>x>>y;
			g[x].push_back(y),g[y].push_back(x);
		}
		dfs(1,0); 
		if(f) puts("NO");
		else puts("YES");
	}
}

 

你可能感兴趣的:(思维,基础算法——数论,#,DFS)