问题 A: 剩下的树
题目描述
有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,...,L共L+1个位置上有L+1棵树。
现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。
可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。
输入
两个整数L(1<=L<=10000)和M(1<=M<=100)。
接下来有M组整数,每组有一对数字。
输出
可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。
样例输入
4 2
1 2
0 2
11 2
1 5
4 7
0 0
样例输出
2
5
#include <stdio.h>
#include <string.h>
int a[100001];
int main()
{
int N,M,min,max,count;
while(scanf("%d%d",&N,&M) != EOF)
{
memset(a,0,sizeof(a));
for(int i=0;i<M;i++)
{
scanf("%d%d",&min,&max);
for(int j=min;j<=max;j++)
{
a[j]=1;
}
}
count=0;
for(int i=0;i<=N;i++)
{
if(a[i]==0)
{
count ++;
}
}
printf("%d\n",count);
}
return 0;
}
问题 B: A+B
题目描述
给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。
现在请计算A+B的结果,并以正常形式输出。
输入
输入包含多组数据数据,每组数据占一行,由两个整数A和B组成(-10^9 < A,B < 10^9)。
输出
请计算A+B的结果,并以正常形式输出,每组数据占一行。
样例输入
-234,567,890 123,456,789
1,234 2,345,678
样例输出
-111111101
2346912
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
char a[10],b[10];
int num1,num2,N1,N2,m1,m2;
//num1,num2分别表示输入的两个数
//m1,m2表示位数的次幂,如十位就*10
while(scanf("%s%s",&a,&b) != EOF)
{
num1=num2=0;
m1=m2=0;
N1=strlen(a);
N2=strlen(b);
for(int i=N1-1;i>=0;i--)//从最低位开始计算
{
if(a[i] >= '0'&&a[i] <= '9')
{
num1=num1+(a[i]-48)*pow(10,m1);
//ascall码的数值与真值相差48.
m1++;
}
}
for(int i=N2-1;i>=0;i--)
{
if(b[i] >= '0'&&b[i] <= '9')
{
num2=num2+(b[i]-48)*pow(10,m2);
m2++;
}
}
if(a[0] == '-')
{
num1=(-1)*num1;
}
if(b[0] == '-')
{
num2=(-1)*num2;
}
printf("%d\n",num1+num2);
}
return 0;
}
问题 C: 特殊乘法
题目描述
输入
两个小于1000000000的数
输出
输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果。
样例输入
24 65
42 66666
3 67
样例输出
66
180
39
#include <stdio.h>
#include <string.h>
int main()
{
char a[11],b[11];
int n1,n2,sum;
while(scanf("%s%s",a,b) !=EOF)
{
n1=strlen(a);
n2=strlen(b);
sum=0;
for(int i=0;i<n1;i++)
{
for(int j=0;j<n2;j++)
{
sum=sum+(a[i]-48)*(b[j]-48);
}
}
printf("%d\n",sum);
}
return 0;
}
问题 D: 比较奇偶数个数
题目描述
第一行输入一个数,为n,第二行输入n个数,这n个数中,如果偶数比奇数多,输出NO,否则输出YES。
输入
输入有多组数据。
每组输入n,然后输入n个整数(1<=n<=1000)。
输出
如果偶数比奇数多,输出NO,否则输出YES。
样例输入
1
67
7
0 69 24 78 58 62 64
样例输出
YES
NO
#include <stdio.h>
int main()
{
int n,num[1001],odd,even ;
while(scanf("%d",&n) !=EOF)
{
odd=even=0;
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
for(int i=0;i<n;i++)
{
if(num[i]%2 == 0)
{
even ++;
}
else odd ++;
}
if(even<odd)
{
printf("YES\n");
}
else printf("NO\n");
}
return 0;
}
问题 E: Shortest Distance (20)
题目描述
输入
输出
样例输入
5 1 2 4 14 9
3
1 3
2 5
4 1
样例输出
3
10
7
#include <stdio.h>
//因时间复杂度为O(n2)级,judge超时
int D[100001];//Di表示Di个出口和D(i+1)个出口的距离
int main()
{
int n,m,dr,dl,cycle,x,y;
//dr表示Di与Dj个出口的右距离
//dl dr表示Di与Dj个出口的左距离
//cycle表示总距离
cycle=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&D[i]);
cycle=cycle+D[i];
}
scanf("%d",&m);
while (m--)
{
scanf("%d%d",&x,&y);
dr=dl=0;
if(x<y)
{
for(int j=x;j<y;j++)
{
dr=dr+D[j];
}
dl=cycle-dr;
}
else if(x>y)
{
for(int j=y;j<x;j++)
{
dr=dr+D[j];
}
dl=cycle-dr;
}
if(dr>dl) printf("%d\n",dl);
else printf("%d\n",dr);
}
return 0;
}
#include <stdio.h>
//因时间复杂度为O(n)级,judge通过
int D[100001];//Di表示第一个出口与第i个出口之间的距离
int main()
{
int n,m,dr,dl,cycle,x,y,count;
//dr表示Di与Dj个出口的右距离
//dl,dr表示Di与Dj个出口的左距离
//cycle表示总距离
while(scanf("%d",&n) != EOF)
{
D[1]=0;
cycle=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&count);
cycle=cycle+count;
D[i+1]=cycle;
}
scanf("%d",&m);
while (m--)
{
scanf("%d%d",&x,&y);
dr=dl=0;
if(x<y)
{
dr=D[y]-D[x];
dl=cycle-dr;
}
else if(x>y)
{
dr=D[x]-D[y];
dl=cycle-dr;
}
if(dr>dl) printf("%d\n",dl);
else printf("%d\n",dr);
}
}
return 0;
}
问题 F: A+B和C (15)
题目描述
输入
输出
样例输入
4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647
样例输出
Case #1: false
Case #2: true
Case #3: true
Case #4: false
#include <stdio.h>
int main()
{
int n,count=0;
long long A , B , C;
scanf("%d",&n);
while(n--)
{
scanf("%ld%ld%ld",&A,&B,&C);
count ++;
if(A+B>C)
{
printf("Case #%d: true\n",count);
}
else printf("Case #%d: false\n",count);
}
return 0;
}
问题 G: 数字分类 (20)
题目描述
给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:
A1 = 能被5整除的数字中所有偶数的和;A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;A3 = 被5除后余2的数字的个数;A4 = 被5除后余3的数字的平均数,精确到小数点后1位;A5 = 被5除后余4的数字中最大数字。输入
输出
对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出“N”。
样例输入
13 1 2 3 4 5 6 7 8 9 10 20 16 18
8 1 2 4 5 6 7 9 16
样例输出
30 11 2 9.7 9
N 11 2 N 9
#include <stdio.h>
#include <math.h>
int main()
{
int n,num[1001],A1,A2,A3,A5,temp,count2,count4;
int flag1,flag2,flag3,flag4,flag5;//标志项
double A4,sum4;
while( scanf("%d",&n) != EOF)
{
A1=A2=A3=A5=0;
sum4=A4=0.0;
count2 = count4 = 0;
flag1=flag2=flag3=flag4=flag5=0;
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
for(int i=0;i<n;i++)
{
if(num[i]%5==0&&num[i]%2==0)
{
A1=A1+num[i];
flag1=1;
}
else if(num[i]%5==1)
{
temp=pow((-1),count2)*num[i];
A2=A2+temp;
count2 ++;
flag2=1;
}
else if(num[i]%5==2)
{
A3 ++;
flag3=1;
}
else if(num[i]%5==3)
{
count4 ++;
sum4=sum4+num[i];
A4=sum4/count4;
flag4=1;
}
else if(num[i]%5==4)
{
if(A5<num[i])
{
A5=num[i];
}
flag5=1;
}
}
if(flag1) printf("%d ",A1);
else printf("N ");
if(flag2) printf("%d ",A2);
else printf("N ");
if(flag3) printf("%d ",A3);
else printf("N ");
if(flag4) printf("%.1f ",A4);
else printf("N ");
if(flag5) printf("%d\n",A5);
else printf("N\n");
}
return 0;
}
问题 H: 部分A+B (15)
题目描述
正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。
现给定A、DA、B、DB,请编写程序计算PA + PB。
输入
输出
样例输入
3862767 6 13530293 3
3862767 1 13530293 8
样例输出
399
0
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
char a[20],b[20];
int n1,n2,count1,count2;
long long num1,num2;
while(scanf("%s%d%s%d",&a,&n1,&b,&n2) != EOF)
{
num1=num2=0;
count1=count2=0;
for(int i=0;i<strlen(a);i++)
{
if(a[i]-48 == n1)//字符数与真值相差48
{
num1=num1+n1*pow(10,count1);
count1 ++;
}
}
for(int i=0;i<strlen(b);i++)
{
if(b[i]-48 == n2)
{
num2=num2+n2*pow(10,count2);
count2 ++;
}
}
printf("%lld\n",num1+num2);
}
return 0;
}
问题 I: 锤子剪刀布
题目描述
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入
输出
样例输入
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
样例输出
5 3 2
2 3 5
B B
#include <stdio.h>
int main()
{
int n,count1,count2,count3,x1,x2,x3,y1,y2,y3;
//count1,count2,count3分别记录甲方胜平负的次数
//x1,x2,x3 分别标记甲方石头 剪刀 布的获胜次数
//y1,y2,y3 分别标记乙方石头 剪刀 布的获胜次数
char a,b,c;
while(scanf("%d",&n) != EOF)
{
count1=count2=count3=0;
x1=x2=x3=y1=y2=y3=0;
for(int i=0;i<n;i++)
{
scanf(" %c %c",&a,&b);
if(a=='C')
{
if(b=='C')
{
count2 ++;
}
else if(b=='J')
{
count1 ++;
x1 ++;
}
else if(b=='B')
{
count3 ++;
y3 ++;
}
}
else if(a=='J')
{
if(b=='C')
{
count3 ++;
y1 ++;
}
else if(b=='J')
{
count2 ++;
}
else if(b=='B')
{
count1 ++;
x2 ++;
}
}
else if(a=='B')
{
if(b=='C')
{
count1 ++;
x3 ++;
}
else if(b=='J')
{
count3 ++;
y2 ++;
}
else if(b=='B')
{
count2 ++;
}
}
}
printf("%d %d %d\n",count1,count2,count3);
printf("%d %d %d\n",count3,count2,count1);
if(x1>x2&x1>x3) printf("C ");
else if(x2>x1&x2>x3) printf("J ");
else if(x3>x1&x3>x2) printf("B ");
else if(x1==x2&&x1>x3&&x2>x3) printf("C ");
else if(x2==x3&&x2>x1&&x3>x1) printf("B ");
else if(x1==x3&&x1>x2&&x3>x2) printf("B ");
else if(x1==x2&&x1==x3) printf("B ");
if(y1>y2&y1>y3) printf("C\n");
else if(y2>y1&y2>y3) printf("J\n");
else if(y3>y1&y3>y2) printf("B\n");
else if(y1==y2&&y1>y3&&y2>y3) printf("C\n");
else if(y2==y3&&y2>y1&&y3>y1) printf("B\n");
else if(y1==y3&&y1>y2&&y3>y2) printf("B\n");
else if(y1==y2&&y1==y3) printf("B\n");
}
return 0;
}