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
");
}
}