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

 思路:

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

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

#include<bits/stdc++.h>

using namespace std;
//#define PII pair<int,string> 
//const int N =1e5+10;
//int a[N];
//unordered_map<int,int> 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

 思路:

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

#include<bits/stdc++.h>

using namespace std;
//#define PII pair<int,string> 
//const int N =1e5+10;
//int a[N];
//unordered_map<int,int> 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 <<endl;
	}
}

C. Uncle Bogdan and Country Happiness

 思路:

 对任何一个节点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 <bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int h[N],p[N],siz[N],b[N],f;
vector<int> g[N];
void dfs(int v,int fa)
{
	siz[v]=p[v];
	for(int i=0;i<g[v].size();i++)
	{
		int u=g[v][i];
		if(u==fa) continue;
		dfs(u,v);
		siz[v]+=siz[u];
		b[v]+=b[u];
	}
	if(abs(h[v])%2!=siz[v]%2) f=1;
	if(abs(h[v])>siz[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");
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值