我的心愿是世界和平!
题目来源:http://acm.sdibt.edu.cn:8080/vjudge/contest/view.action?cid=1793#overview
A : Which Base is it Anyway?
假设该数字为八进制、十进制、十六进制数,求其转换为十进制数后的大小。
#include<stdio.h>
#include<string.h>
char s[10];
int main()
{
int m,k,i;
scanf("%d",&m);
while(m--)
{
int n=0,p=0,q=0,t;
scanf("%d%s",&k,s);
for(i=0; i<strlen(s)-1; i++)
{
if(s[i]-'0'>=8)//**若该数字大于八,它不是八进制数**
{
n=0;
break;
}
t=s[i]-'0';
n=(n+t)*8;
}
if(s[i]-'0'>=8)
n=0;
else
{
t=s[i]-'0';
n=n+t;
}
for(i=0; i<strlen(s)-1; i++)
{
t=s[i]-'0';
p=(p+t)*10;
}
t=s[i]-'0';
p=p+t;
for(i=0; i<strlen(s)-1; i++)
{
t=s[i]-'0';
q=(q+t)*16;
}
t=s[i]-'0';
q=q+t;
printf("%d %d %d %d\n",k,n,p,q);
}
return 0;
}
B : DA-Sort
选一个数字将其删除并接入队尾,使其从小到大排列,求最少移动数字。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int s[1011];
int a[1011];
int main()
{
int i,m,n,k;
scanf("%d",&m);
while(m--)
{
int sum=0;
scanf("%d%d",&k,&n);
for(i=0;i<n;i++)
{
scanf("%d",&s[i]);
a[i]=s[i];
}
sort(a,a+n);
for(i=0;i<n;i++)
{
if(s[i]==a[sum])
{
sum++;
}
}
printf("%d %d\n",k,n-sum);
}
return 0;
}
C : A Rational Sequence
首为1/1,接下来左为p/(p+q),右为(p+q)/q,求他的位置。
#include<stdio.h>
long long int s[1000000];
int main()
{
long long int m,k,a,b;
char c;
scanf("%lld",&m);
while(m--)
{
long long int sum=1;
scanf("%lld%lld%c%lld",&k,&a,&c,&b);
long long int i=-1;
while(1)
{
if(a>b)//**右孩子**
{
s[++i]=1;
a=a-b;
}
if(a<b)//**左孩子**
{
s[++i]=0;
b=b-a;
}
if(a==b)//**首部**
{
break;
}
}
for(;i>=0;i--)
{
sum=sum*2+s[i];//**利用二叉树的规律**
}
printf("%lld %lld\n",k,sum);
}
return 0;
}
D : Alphabet
给定一字符串,在其任一位置删除字母或添加字母,求其最少添加字母的数量。
#include<stdio.h>
#include<string.h>
char s[55];
int a[55];
int main()
{
int i,j;
while(~scanf("%s",s))
{
int max=0,sum=0;
for(i=0;i<=54;i++)
a[i]=1;
for(i=0;i<strlen(s);i++)//**求最长上升子序列**
{
max=0;
for(j=0;j<i;j++)
{
if(s[i]>s[j])
{
if(max<a[j])
max=a[j];
}
}
a[i]=a[i]+max;
if(sum<a[i])
sum=a[i];
}
printf("%d\n",26-sum);
}
return 0;
}
E : Classy
upper>middle>lower,从后向前比较,更大的名字在前面,若不足,则添middle,若均相同,按名字顺序排列。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char b[270];
struct person
{
char per[50];
int a[50];
} s[1010];
int cmp(const void *a,const void *b)
{
int i;
struct person *c=(person *)a;
struct person *d=(person *)b;
for(i=49; i>=0;)
{
if(d->a[i]!=c->a[i])
return d->a[i]-c->a[i];
else
i--;
}
return strcmp((char *)c->per,(char *)d->per);
}
int main()
{
int i,j,m,t;
while(~scanf("%d",&m))
{
for(i=0; i<=1000; i++)
for(j=0; j<=49; j++)
s[i].a[j]=2;
getchar();
for(i=0; i<m; i++)
{
gets(b);
t=-1;
int suan=49;
for(j=0; j<strlen(b); j++)
if(b[j]==' ')
t++;
for(j=0; j<strlen(b); j++)
{
if(b[j]==':')
{
s[i].per[j]='\0';
break;
}
else
s[i].per[j]=b[j];
}
suan-=t;
for(j=strlen(s[i].per); j<strlen(b); j++)
{
if(b[j]==' ');
else
{
if(b[j]=='u')
{
s[i].a[++suan]=3;
j+=5;
}
else if(b[j]=='m')
{
s[i].a[++suan]=2;
j+=6;
}
else if(b[j]=='l')
{
s[i].a[++suan]=1;
j+=5;
}
if(b[j]=='c')
break;
}
}
}
qsort(s,m,sizeof(s[0]),cmp);
for(i=0; i<m; i++)
{
printf("%s\n",s[i].per);
}
printf("\n");
}
}
F : Euclid’s Game
博弈,用大的数字减小的数字,若有倍数,可减任意倍,Stan优先进行,谁先减到0谁赢。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int m,n;
while(scanf("%d%d",&m,&n))
{
if(m==0&&n==0)
break;
int sum=0;
while(1)
{
if(m-n>=n||n-m>=m)//**可控制接下来的顺序**
{
sum++;
break;
}
if(m>=n)
m-=n;
else
n-=m;
sum++;
if(m==0||n==0)
break;
}
if(sum%2==0)
printf("Ollie wins\n");
else
printf("Stan wins\n");
}
return 0;
}
G : Six Sides
丢骰子,求赢的概率。
#include<stdio.h>
int a[6];
int b[6];
int main()
{
int i,j;
while(~scanf("%d",&a[0]))
{
double m=0.0;
for(i=1;i<=5;i++)
scanf("%d",&a[i]);
for(i=0;i<=5;i++)
scanf("%d",&b[i]);
int sum=0,t=0;
for(i=0;i<=5;i++)
{
for(j=0;j<=5;j++)
{
if(a[i]>b[j])
sum++;
else if(a[i]==b[j])
t++;
}
}
if(t==36)
printf("0.00000\n");
else
{
m=sum*1.0/(36-t);
printf("%.5lf\n",m);
}
}
}
H : acm实验室里的故事
三个矩形可否构成正方形。
#include<stdio.h>
int main()
{
int m,n,p,q,x,y,t;
while(scanf("%d%d",&m,&n)!=EOF)
{
scanf("%d%d%d%d",&p,&q,&x,&y);
if(m<n)
{
t=m;m=n;n=t;
}
if(p<q)
{
t=p;p=q;q=t;
}
if(x<y)
{
t=x;x=y;y=t;
}
if(m<x)
{
t=m;m=x;x=t;
t=n;n=y;y=t;
}
if(m<p)
{
t=m;m=p;p=t;
t=n;n=q;q=t;
}
t=0;
if(m==p&&p==x)//**边长为m的正方形**
{
if(m==n+y+q)
t=1;
}
if(m==p+x)//**接下来类似的四种正方形**
{
if(q==y&&n+q==m)
t=1;
}
if(m==q+y)
{
if(p==x&&n+p==m)
t=1;
}
if(m==q+x)
{
if(p==y&&n+p==m)
t=1;
}
if(m==p+y)
{
if(q==x&&n+q==m)
t=1;
}
if(t==1)
printf("YES\n");
else
printf("NO\n");
}
}