Codeforces Round #660 (Div. 2)

A. Captain Flint and Crew Recruitment

题意

给定一个n是四个数的和,四个数中至少有三个准质数(分解为两个质数的积),四个数互不相同,分解的两个质数也不同。

思路

A题一定不是难题,枚举一下可以知道,要最小可能三个的准质数(前三个或者前二到四个),检查是否可行即可。

代码


int a[7]={0,6,10,14,15,21,22};
int n;
bool check(int x,int y,int z)
{
	if(x+y+z>=n)return 0;
	int pp=n-x-y-z;
	if(pp==x||pp==y||pp==z)return 0;
	return 1;
}
int main()
{
    int T;
    scanf("%d", &T);
	while(T--)
	{
		n=read();
		int flag=0;
		for(int i=1;i<=4;i++)
		{
		
		for(int j=i+1;j<=5;j++)
		{
		
		for(int k=j+1;k<=6;k++)
		{
			if(check(a[i],a[j],a[k]))
			{
				printf("YES
");
				printf("%d %d %d %d
",a[i],a[j],a[k],n-(a[i]+a[j]+a[k]));
				flag=1;
				break;
			}
		}
			if(flag)break;
		}
			if(flag)break;
		}
		if(!flag)
		printf("NO
");
	}
    return 0;
}

C. Uncle Bogdan and Country Happiness

题意:

有n个城市m个人,每个城市有若干的人的家,每个人有好的或者坏的心情,他们都要从1(首都)以最短路径回家。每个城市有个快乐值为经过的好心情的人数减去坏心情的人数,每个人可以在路上从好心情变坏但是不能从坏心情变好,检查每个城市的快乐值可能正确吗?

思路

树形dp问题,但是要注意好心情和坏心情的人数分配后要大于等于0,我就是这样wa了

代码


vector<int >g[100005];
int h[100005],p[100005];
int dp[100005][2];//[0]好心情//[1]坏心情或者可分配的心情
int flag;
void dfs(int u,int fa)
{
	if(!flag)return;
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i];
		if(v==fa)continue;
		dfs(v,u);
		dp[u][0]+=dp[v][0];
		dp[u][1]+=dp[v][1];
	}
	int cha=h[u]-(dp[u][0]-dp[u][1]);
	if(cha<0)
	{
		flag=0;
		return;
	}
	if(cha%2==1)
	{
		flag=0;
		return;
	}
	int jian=cha/2;
	dp[u][0]+=jian;
	dp[u][1]-=jian;
	if(dp[u][0]<0)flag=0;
	if(dp[u][1]<0)flag=0;
}
main(void)
{
	int t=read();
	while(t--)
	{
		flag=1;
		int n=read();
		for(int i=1;i<=n;i++)
		{
			g[i].clear();
			dp[i][0]=0;
			dp[i][1]=0;	
		} 
		int m=read();
		for(int i=1;i<=n;i++)
		{
			p[i]=read();
			dp[i][1]=p[i];
		}
		for(int i=1;i<=n;i++)
		{
			h[i]=read();
		}
		for(int i=1;i<=n-1;i++)
		{
			int x=read();
			int y=read();
			g[x].push_back(y);
			g[y].push_back(x);
		}
		dfs(1,1);
		if(flag)printf("YES
");
		else printf("NO
"); 
	}
}

原文地址:https://www.cnblogs.com/wangqianyv/p/13409072.html