这次比赛做得不要太难看。
A、简单题。
#include<stdio.h>
#include<string.h>
int main()
{
int n,m,k;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
int x,y;
x=y=0;
for(int i=1;i<=n;i++)
{
int temp;
scanf("%d",&temp);
if(temp==1) x++;
else y++;
}
int ans=0;
if(m<x)
{
ans+=x-m;
if(k<y) ans+=y-k;
}
else
{
m-=x;
if(m+k<y) ans=y-m-k;
}
printf("%d\n",ans);
}
return 0;
}
B、简单题。
#include<stdio.h>
#include<string.h>
int main()
{
int n,k,l,r,sa,sk;
while(scanf("%d%d%d%d%d%d",&n,&k,&l,&r,&sa,&sk)!=EOF)
{
int x,y;
x=sk/k;
y=sk%k;
for(int i=1;i<=y;i++) printf("%d ",x+1);
for(int i=y+1;i<=k;i++) printf("%d ",x);
sa-=sk;
if(n-k==0) continue;
x=sa/(n-k);
y=sa%(n-k);
n-=k;
for(int i=1;i<=y;i++) printf("%d ",x+1);
for(int i=y+1;i<=n;i++) printf("%d ",x);
printf("\n");
}
return 0;
}
C、一个简单的树形DP,如果一个节点的子树中修过路,那么这条节点到1的路就一定不修。
#include<stdio.h>
#include<string.h>
#define N 200005
struct node
{
int from,to;
int data;
int next;
}a[N*2];
int head[N],vis[N],ans[N];
int tol,k;
void add(int x,int y,int k)
{
a[tol].from=x;a[tol].to=y;a[tol].data=k;a[tol].next=head[x];head[x]=tol++;
a[tol].from=y;a[tol].to=x;a[tol].data=k;a[tol].next=head[y];head[y]=tol++;
return ;
}
int dfs(int x)
{
int cnt=0;
vis[x]=1;
for(int i=head[x];i!=-1;i=a[i].next)
{
int flag=0;
if(vis[a[i].to]) continue;
if(!vis[a[i].to])
{
if(dfs(a[i].to))
{
flag++;
cnt++;
}
}
if(flag==0&&a[i].data==2)
{
ans[k++]=a[i].to;
cnt++;
}
}
if(cnt>0) return 1;
return 0;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(head,-1,sizeof(head));
tol=0;
for(int i=1;i<n;i++)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
add(x,y,k);
}
k=0;
memset(vis,0,sizeof(vis));
dfs(1);
printf("%d\n",k);
for(int i=0;i<k;i++) printf("%d ",ans[i]);
printf("\n");
}
return 0;
}