前两题就直接粘代码了。。
题目地址:A. Valera and Plates
AC代码:
#include<iostream> #include<cstdio> using namespace std; int main() { int n,m,k,i; int t; while(cin>>n>>m>>k) { int ans=0; for(i=1;i<=n;i++) { scanf("%d",&t); if(t==1) { if(m) { m--; } else { ans++; } } else { if(k) { k--; } else if(m) { m--; } else ans++; } } cout<<ans<<endl; } return 0; }
AC代码:
#include<iostream> #include<cstdio> using namespace std; int a[1002]; int main() { int n,k,l,r,sall,sk,i,j; int tmp,tn; while(cin>>n>>k>>l>>r>>sall>>sk) { tn=n-k; for(i=1; i<=n; i++) { if(sk==0) { //cout<<i<<endl; for(j=i; j<=n; j++) { //cout<<sall<<" "<<tn<<endl; tmp=sall/tn; if(sall%tn) tmp++; //cout<<tmp<<endl; a[j]=tmp; sall-=tmp; tn--; } break; } tmp=sk/k; if(sk%k) tmp++; a[i]=tmp; sk-=tmp; sall-=tmp; k--; } cout<<a[1]; for(i=2; i<=n; i++) cout<<" "<<a[i]; cout<<endl; } return 0; }
题目不难,当时看见大概有六百+的人过了这题的样例,但是自己想不到怎么样来建图。。。题目意思不难理解,就是说有n个顶点,1,2.....n这样的定点,然后有n-1条边,确保是一颗树。边的值可以是1,代表这条路没问题,是2代表有问题。需要人来修,现在选人数最少的人来修所有为2的边。一个人可以修到1过程中走的路上的所有边。于是问他抽象出来就是找离1最远的点并且边是2这样的点。一直苦于不知如何建图。。。。
解题思路:
1)用vector数组保存每个节点的子节点;
2)深搜,找到每个节点的父节点,从而建立一棵树;
3)每个结点往上面找,如果这个点需要修路,把他自己设置为1,把他所有的父亲祖宗结点都变为0,并设置为访问过,访问过的就不再访问了。
AC代码:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<vector> using namespace std; const int maxn=100005; int visi[maxn]; //dfs建树的时候用 从叶子向根遍历的时候用 int par[maxn]; vector <int> mq[maxn]; int p[maxn]; struct node { int a; int b; int val; }; node road[maxn]; void dfs(int p) { for(int i=0;i<mq[p].size();i++) { int cur=mq[p][i]; if(!visi[cur]) { visi[cur]=1; par[cur]=p; dfs(cur); } } } int main() { int n,i; int l,r,v; while(cin>>n) { memset(visi,0,sizeof(visi)); for(i=1;i<=n;i++) mq[i].clear(); for(i=0; i<n-1; i++) //先把所有结点的关系建立起来 { scanf("%d%d%d",&l,&r,&v); road[i].a=l,road[i].b=r,road[i].val=v; mq[l].push_back(r); mq[r].push_back(l); } visi[1]=1; dfs(1); //由1为根结点建树 memset(visi,0,sizeof(visi)); memset(p,0,sizeof(p)); for(i=0;i<n-1;i++) { l=road[i].a,r=road[i].b; v=road[i].val; int t; //t为孩子结点 if(v==2) { if(par[l]==r) t=l; else t=r; if(!visi[t]) { p[t]=1; int x=par[t]; while(x!=1) { if(visi[x]) break; visi[x]=1; p[x]=0; x=par[x]; } } } } int ans=0; for(i=1;i<=n;i++) if(p[i]==1) ans++; cout<<ans<<endl; int flag=0; for(i=n;i>=1;i--) if(p[i]==1) { if(flag==0) { flag=1; printf("%d",i); } else printf(" %d",i); } cout<<endl; } return 0; }
作者:opm777 发表于2013-12-6 0:22:48 原文链接
阅读:239 评论:0 查看评论