水题就不说了
#include <iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
char s[150];
int num[100],cnt;
int main()
{
int i;
while(~scanf("%s",s))
{
cnt=0;
for(i=0;s[i]!='\0';i++)
if(s[i]!='+')
num[cnt++]=s[i]-'0';
sort(num,num+cnt);
printf("%d",num[0]);
for(i=1;i<cnt;i++)
printf("+%d",num[i]);
printf("\n");
}
return 0;
}
题目不好懂。读懂了就是水题。就是一个人只能朝着一个方向走。问按这题目给定顺序走完全程需要的时间。注意只能朝一个方向走。
详细见代码:
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int a[100100];
int main()
{
int n,m,i,pre;
__int64 ans;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<m;i++)
scanf("%d",a+i);
ans=0;
pre=1;
for(i=0;i<m;i++)
{
if(a[i]>=pre)
ans+=a[i]-pre;
else
ans+=n-pre+a[i];
pre=a[i];
}
printf("%I64d\n",ans);
}
return 0;
}
开始犹豫了下。没敢写。抱着试一试的态度暴力写了下就过了。。看来深搜的时间复杂度真不好估计。
详细见代码:
#include <iostream>
#include<stdio.h>
using namespace std;
int wei[15],cnt,m;
int ans[1010];
char var[15];
bool dfs(int le,int ri,int k,int pre,int op)
{
int i,t;
if(k==m+1)
return true;
if(!op)
{
for(i=0;i<cnt;i++)
{
t=wei[i]+le;
if(wei[i]!=pre&&t>ri)
{
ans[k]=wei[i];
if(dfs(t,ri,k+1,wei[i],!op))
return true;
}
}
}
else
{
for(i=0;i<cnt;i++)
{
t=wei[i]+ri;
if(wei[i]!=pre&&t>le)
{
ans[k]=wei[i];
if(dfs(le,t,k+1,wei[i],!op))
return true;
}
}
}
return false;
}
int main()
{
int i;
while(~scanf("%s",var))
{
scanf("%d",&m);
cnt=0;
for(i=0;var[i]!='\0';i++)
if(var[i]=='1')
wei[cnt++]=i+1;
if(dfs(0,0,1,-1,0))
{
printf("YES\n");
for(i=1;i<m;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[i]);
}
else
printf("NO\n");
}
return 0;
}
简单线段树。
详细见代码:
#include <iostream>
#include<stdio.h>
using namespace std;
int val[1<<20],op[1<<20];
void btree(int L,int R,int k)
{
int mid,ls,rs;
if(L==R)
{
scanf("%d",&val[k]);
op[k]=1;
return ;
}
ls=k<<1;
rs=ls|1;
mid=(L+R)>>1;
btree(L,mid,ls);
btree(mid+1,R,rs);
op[k]=op[ls]^1;
if(op[k])
val[k]=val[ls]^val[rs];
else
val[k]=val[ls]|val[rs];
}
void update(int L,int R,int p,int b,int k)
{
int mid,ls,rs;
if(L==R)
{
val[k]=b;
return;
}
ls=k<<1;
rs=ls|1;
mid=(L+R)>>1;
if(p>mid)
update(mid+1,R,p,b,rs);
else
update(L,mid,p,b,ls);
if(op[k])
val[k]=val[ls]^val[rs];
else
val[k]=val[ls]|val[rs];
}
int main()
{
int n,m,p,b,i,lim;
while(~scanf("%d%d",&n,&m))
{
lim=1<<n;
btree(1,lim,1);
for(i=0;i<m;i++)
{
scanf("%d%d",&p,&b);
update(1,lim,p,b,1);
printf("%d\n",val[1]);
}
}
return 0;
}
那次比赛没打。是下来写的,下来感觉蛮简单的。不过如果当时打了。第二题估计写不出来。因为题目我下来确实没读懂。