A、简单题。
#include<stdio.h>
#include<string.h>
int main()
{
int cnt1,cnt2,cnt3;
char s[105];
while(gets(s))
{
int ln;
ln=strlen(s);
cnt1=cnt2=cnt3=0;
int i;
for(i=0; i<=ln; i++)
{
if(s[i]=='1')
cnt1++;
else if(s[i]=='2')
cnt2++;
else if(s[i]=='3')
cnt3++;
}
for(i=0; i<ln; i++)
{
if(i%2!=0)
printf("+");
else
{
if(cnt1)
{
printf("1");
cnt1--;
}
else if(cnt2)
{
printf("2");
cnt2--;
}
else
printf("3");
}
}
printf("\n");
}
return 0;
}
B、简单题。直接模拟就行。
#include<stdio.h>
#include<string.h>
#define N 100005
__int64 a[N];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i;
for(i=1;i<=m;i++)
scanf("%I64d",&a[i]);
__int64 temp,sum;
temp=1;sum=0;
for(i=1;i<=m;i++)
{
if(a[i]>=temp)
sum+=a[i]-temp;
else
{
sum+=n-temp+a[i];
}
temp=a[i];
}
printf("%I64d\n",sum);
}
return 0;
}
C、不知道是数据简单还是我对深搜理解的不好,这道题直接搜索就过了。我一直觉得我的深搜写的很丑。
#include<stdio.h>
#include<string.h>
#define N 1005
int ans[N],flag,k,m;
char s[15],mark[15];
void dfs(int left,int right,int cur,int cnt,int x)
{
if(cnt==m)
{
flag=1;
return ;
}
int i;
for(i=1;i<=10;i++)
{
if(mark[i])
{
if(x==0)
{
if(i!=cur&&left+i>right)
{
left+=i;x=(x+1)%2;ans[k++]=i;cnt++;
dfs(left,right,i,cnt,x);
if(flag)
return ;
left-=i;x=(x+1)%2;k--;cnt--;
}
}
else
{
if(i!=cur&&right+i>left)
{
right+=i;x=(x+1)%2;
ans[k++]=i;cnt++;
dfs(left,right,i,cnt,x);
if(flag)
return ;
left-=i;x=(x+1)%2;k--;cnt--;
}
}
}
}
return ;
}
int main()
{
while(gets(s))
{
scanf("%d",&m);
getchar();
int i;
memset(mark,0,sizeof(mark));
for(i=0;i<10;i++)
{
if(s[i]=='1')
mark[i+1]=1;
}
int cnt,left,right,x;
cnt=left=right=x=k=0;
flag=0;
for(i=1;i<=10;i++)
{
if(mark[i])
{
left+=i;x=(x+1)%2;
ans[k++]=i;cnt++;
dfs(left,right,i,cnt,x);
if(flag)
break;
left-=i;x=(x+1)%2;
k--;cnt--;
}
}
if(!flag)
printf("NO\n");
else
{
printf("YES\n");
for(i=0;i<k-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[i]);
}
}
return 0;
}
D、一道非常简单的线段树,奈何我的英语不过关,比赛的时候一直没有弄清楚题目的意思。。。。
#include<stdio.h>
#include<string.h>
#define N 400000
struct node
{
int x,y;
int num,k;
} a[N];
int b[N];
void CreatTree(int t,int x,int y)
{
a[t].x=x;
a[t].y=y;
if(x==y)
{
a[t].num=b[x];
a[t].k=0;
return ;
}
int temp=t*2;
int mid=(x+y)/2;
CreatTree(temp,x,mid);
CreatTree(temp+1,mid+1,y);
if(a[temp].k%2==0)
{
a[t].num=a[temp].num|a[temp+1].num;
a[t].k=a[temp].k+1;
return ;
}
else
{
a[t].num=a[temp].num^a[temp+1].num;
a[t].k=a[temp].k+1;
return ;
}
}
void InsertTree(int t,int x,int k)
{
if(a[t].x==a[t].y&&a[t].x==x)
{
a[t].num=k;
return ;
}
int temp=t*2;
int mid=(a[t].x+a[t].y)/2;
if(x<=mid)
InsertTree(temp,x,k);
else
InsertTree(temp+1,x,k);
if(a[t].k%2!=0)
{
a[t].num=a[temp].num|a[temp+1].num;
return ;
}
else
{
a[t].num=a[temp].num^a[temp+1].num;
return ;
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int t=1;
while(n--)
t*=2;
int i;
for(i=1; i<=t; i++)
scanf("%d",&b[i]);
CreatTree(1,1,t);
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
InsertTree(1,x,y);
printf("%d\n",a[1].num);
}
}
return 0;
}