分情况讨论下就好。
只会出现
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\n");
continue;
}
for(i=0;i<cnt[4];i++)
printf("1 2 4\n");
for(i=0;i<cnt[6]-cnt[3];i++)
printf("1 2 6\n");
for(i=0;i<cnt[3];i++)
printf("1 3 6\n");
}
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\n",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\n",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\n",dis[v]);
}
}
}
return 0;
}