分情况讨论下就好。
只会出现
1 2 4
12 6
1 3 6
这几种情况。所以1的个数cnt[1]=n/3.而cnt[6]-cnt[3]+cnt[4]=cnt[2]注意cnt[6]>=cnt[3]就行了。
详细见代码:
#include <iostream> #include<stdio.h> #include<string.h> using namespace std; int cnt[10]; int main() { int n,d,i; while(~scanf("%d",&n)) { memset(cnt,0,sizeof cnt); for(i=0;i<n;i++) { scanf("%d",&d); cnt[d]++; } if(cnt[7]||cnt[5]||cnt[1]!=n/3||cnt[6]<cnt[3]||cnt[6]-cnt[3]+cnt[4]!=cnt[2])//开始没加cnt[6]<cnt[3]wa了一发 { printf("-1 "); continue; } for(i=0;i<cnt[4];i++) printf("1 2 4 "); for(i=0;i<cnt[6]-cnt[3];i++) printf("1 2 6 "); for(i=0;i<cnt[3];i++) printf("1 3 6 "); } return 0; }
对于这道题。只能说题意太坑了。有可能我太菜了。。反正它的t要小心处理。而且最后他一定能传到所以。。。
他监视完后直接往一个方向传就行了。
详细见代码:
#include <iostream> #include<stdio.h> #include<string.h> using namespace std; int p,pre; string way; bool isok(int x,int l,int r) { return x>r||x<l; } int main() { int i,j,t,l,r,s,f,n,m,tmp; while(~scanf("%d%d%d%d",&n,&m,&s,&f)) { p=s; pre=0; way=""; for(i=0; i<m; i++) { scanf("%d%d%d",&t,&l,&r); if(f>p) { if(t-pre!=1) { tmp=t-pre-1; if(tmp>=f-p) { for(j=0;j<f-p;j++) way+="R"; p=f; continue; } else { for(j=0;j<tmp;j++) way+="R"; p+=tmp; } } if(isok(p,l,r)&&isok(p+1,l,r)) { way+="R"; p+=1; } else way+="X"; } else if(p>f) { if(t-pre!=1) { tmp=t-pre-1; if(tmp>=p-f) { for(j=0;j<p-f;j++) way+="L"; p=f; continue; } else { for(j=0;j<tmp;j++) way+="L"; p-=tmp; } } if(isok(p,l,r)&&isok(p-1,l,r)) { way+="L"; p-=1; } else way+="X"; } pre=t; } while(p<f) { way+="R"; p++; } while(p>f) { way+="L"; p--; } cout<<way<<endl; } return 0; }
算是数学题吧。比赛时没做出来。
详细见代码:
#include <iostream> #include<stdio.h> #include<string.h> #include<math.h> const double eps=1e-10; using namespace std; int main() { int r,h,ans; double rest; while(~scanf("%d%d",&r,&h)) { rest=h%r; ans=(h/r)*2+1; if(rest>=0.5*r) ans+=1; if(rest>=0.5*sqrt(3.0)*r) ans+=1; printf("%d ",ans); } return 0; }
开始写了直接更新的。结果果断超时了。。后来用离线算法。1多的时候就直接找。2多的时候就更新。
据算这种算法不对。其它算法还不会。会了再补充吧。
详细见代码:
#include <iostream> #include<stdio.h> #include<string.h> #include<queue> using namespace std; const int maxn=100100; struct node { int v; node *next; } edge[maxn<<1],*head[maxn]; struct pp { int fa; int u; int d; }; int ptr,dis[maxn],op[maxn],x[maxn],cnt; queue<pp> q; void adde(int u,int v) { edge[ptr].v=v; edge[ptr].next=head[u]; head[u]=&edge[ptr++]; } void dfs(int fa,int u,int d) { int v; node *p=head[u]; for(; p!=NULL; p=p->next) { v=p->v; if(v!=fa&&d<dis[v]) { dis[v]=d; dfs(u,v,d+1); } } } void serch(int u) { pp t; node *p; t.u=u; t.fa=u; t.d=0; while(!q.empty()) q.pop(); q.push(t); while(!q.empty()) { t=q.front(); q.pop(); if(dis[t.u]==0) { dis[u]=t.d; break; } for(p=head[t.u]; p!=NULL; p=p->next) { if(p->v!=t.fa) { pp tmp; tmp.d=t.d+1; tmp.fa=t.u; tmp.u=p->v; q.push(tmp); } } } } int main() { int n,m,i,u,v; while(~scanf("%d%d",&n,&m)) { memset(dis,0x3f,sizeof dis); memset(head,0,sizeof head); for(i=1; i<n; i++) { scanf("%d%d",&u,&v); adde(u,v); adde(v,u); } dis[1]=0; cnt=0; dfs(1,1,1); for(i=0; i<m; i++) { scanf("%d%d",&op[i],&x[i]); if(op[i]==1) cnt++; } if(cnt>m/2) { for(i=0; i<m; i++) { v=x[i]; if(op[i]==1) dis[v]=0; else { serch(v); printf("%d ",dis[v]); } } } else { for(i=0; i<m; i++) { v=x[i]; if(op[i]==1) { dis[v]=0; dfs(v,v,1); } else printf("%d ",dis[v]); } } } return 0; }