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