CCF-CSP 2013

201312-1 出现次数最多的数

试题编号:201312-1
试题名称:出现次数最多的数
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。

输入格式

  输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。
  输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相邻的数用空格分隔。

输出格式

  输出这n个次数中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。

样例输入

6
10 1 10 20 30 20

样例输出

10

C程序:

#include<stdio.h>
#define N 10000
int n,temp,max=0;
int input[N+1]={0};
main()
  {
  int i,k;
  scanf("%d",&n);
  for(i=0;i<n;i++)
   {
    scanf("%d",&k);
    input[k]++;
    } 
for(i=1;i<=N;i++)
	if(input[i]>max)  {max=input[i];temp=i;}

printf("%d\n",temp);
return 0;

}

201312-2 ISBN号码

试题编号:201312-2
试题名称:ISBN号码
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
  识别码的计算方法如下:
  首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
  编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出是正确的ISBN号码。

输入格式

  输入只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。

输出格式

  输出一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。

样例输入

0-670-82162-4

样例输出

Right

样例输入

0-670-82162-0

样例输出

0-670-82162-4

//ccf-csp  201312-2
#include<stdio.h>
int n=13;
char isbn[13];     //ISBN编号
int number[9];     //存放数字
int iden=0;
 main()
 {  int i=0,j=0,k;
    int uniden;    //验证码
	 while(--n)
	 {
		  scanf("%c",&isbn[i]);
	      if(isbn[i]!='-') number[j++]=isbn[i]-'0';
		  i++;
	    }       //前九位数字
	 scanf("%c",&isbn[12]);
	 for(k=1;k<=9;k++) iden+=k*number[k-1];
	 iden=iden%11;     //正确的验证码

	 if(isbn[12]!='X')  uniden=isbn[12]-'0';  
	 else uniden=10;

	 if(iden==uniden) printf("Right\n");
	 else 
	 {
	 for(i=0;i<12;i++) printf("%c",isbn[i]);
	 if(iden==10) printf("X\n");
	 else printf("%d\n",iden);}
	 return 0;
  }

 201403-1  相反数

试题编号:201403-1
试题名称:相反数
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。

输入格式

  第一行包含一个正整数 N。(1 ≤ N ≤ 500)。
  第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。

输出格式

  只输出一个整数,即这 N 个数中包含多少对相反数。

样例输入

5
1 2 3 -1 -2

样例输出

2

201403-1
#include<stdio.h>
#define N 500
int input[N+1];
int count=0;
main()
{   int n;
	int i,j;
	scanf("%d",&n);
	for(i=0;i<n;i++) scanf("%d",&input[i]);
	for(i=0;i<n;i++)
	{for(j=i+1;j<n;j++)
	   if(input[i]+input[j]==0) count++;
	 }
	printf("%d\n",count);
	return 0;
}

201409-1 相邻数对

试题编号:201409-1
试题名称:相邻数对
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。

输入格式

  输入的第一行包含一个整数n,表示给定整数的个数。
  第二行包含所给定的n个整数。

输出格式

  输出一个整数,表示值正好相差1的数对的个数。

样例输入

6
10 2 6 3 7 8

样例输出

3

样例说明

  值正好相差1的数对包括(2, 3), (6, 7), (7, 8)。

评测用例规模与约定

  1<=n<=1000,给定的整数为不超过10000的非负整数。

#include<stdio.h>
#define N 10000
int n;
int input[N+1];
main()
{
 int i,j;
 int m=0;
 scanf("%d",&n);
 for(i=0;i<n;i++) scanf("%d",&input[i]);

  for(i=0;i<n;i++)
   {for(j=i+1;j<n;j++)
      if(abs(input[i]-input[j])==1) m++;}
    printf("%d\n",m);
     return 0;
 }

201409-2 画图

试题编号:201409-2
试题名称:画图
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。
  下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。

  给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。

 

输入格式

  输入的第一行包含一个整数n,表示要画的矩形的个数。
  接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。

输出格式

  输出一个整数,表示有多少个单位的面积被涂上颜色。

样例输入

2
1 1 4 4
2 3 6 5

样例输出

15

评测用例规模与约定

  1<=n<=100,0<=横坐标、纵坐标<=100。

 

#include<stdio.h>
#define N 100
int count=0;
int n;
int input[N][N]={0};
main()
{int i,j,k;
int a,b,c,d;
 scanf("%d",&n);
 for(i=0;i<n;i++)
   {scanf("%d %d %d %d",&a,&b,&c,&d);
     for(j=a;j<c;j++)
       for(k=b;k<d;k++)
         input[j][k]=1; 
   }
   for(i=0;i<N;i++)
    for(j=0;j<N;j++)
      {if(input[i][j]==1) count++;}
 printf("%d",count);
return 0;
}

201412-1 门禁系统

试题编号:201412-1
试题名称:门禁系统
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。每位读者有一个编号,每条记录用读者的编号来表示。给出读者的来访记录,请问每一条记录中的读者是第几次出现。

输入格式

  输入的第一行包含一个整数n,表示涛涛的记录条数。
  第二行包含n个整数,依次表示涛涛的记录中每位读者的编号。

输出格式

  输出一行,包含n个整数,由空格分隔,依次表示每条记录中的读者编号是第几次出现。

样例输入

5
1 2 1 1 3

样例输出

1 1 2 3 1

评测用例规模与约定

  1≤n≤1,000,读者的编号为不超过n的正整数。

#include<stdio.h>
#define N 1000
int reader[N+1]={0};
//int outcome[N+1]={0};
main()
 {
	 int n;
	 int i,a;
	 scanf("%d",&n);
	 for(i=0;i<n;i++)
		 {scanf("%d",&a);
	      reader[a]++; 
		  printf("%d ",reader[a]);
	      }
	 printf("\n");
	 return 0;

 }

201503-1 图像旋转

试题编号:201503-1
试题名称:图像旋转
时间限制:5.0s
内存限制:256.0MB
问题描述:

问题描述

  旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。
  计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。

输入格式

  输入的第一行包含两个整数nm,分别表示图像矩阵的行数和列数。
  接下来n行每行包含m个整数,表示输入的图像。

输出格式

  输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。

样例输入

2 3
1 5 3
3 2 4

样例输出

3 4
5 2
1 3

评测用例规模与约定

  1 ≤ n≤ 1,000,矩阵中的数都是不超过1000的非负整数。

#include<stdio.h>
#define N 1000
int input[N+1][N+1];
main()
{
	int n,m;
	int i,j;
	int p,q;
	scanf("%d %d",&n,&m);
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
			scanf("%d",&input[i][j]);

    for(p=m-1;p>=0;p--)
		{for(q=0;q<n;q++)
			printf("%d ",input[q][p]);     
	       printf("\n");}
	return 0;
}

201509-1 数列分段

试题编号:201509-1
试题名称:数列分段
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段?

输入格式

  输入的第一行包含一个整数n,表示数列中整数的个数。
  第二行包含n个整数a1, a2, …, an,表示给定的数列,相邻的整数之间用一个空格分隔。

输出格式

  输出一个整数,表示给定的数列有多个段。

样例输入

8
8 8 8 0 12 12 8 0

样例输出

5

样例说明

  8 8 8是第一段,0是第二段,12 12是第三段,倒数第二个整数8是第四段,最后一个0是第五段。

评测用例规模与约定

  1 ≤ n ≤ 1000,0 ≤ ai ≤ 1000。

#include<stdio.h>
#define N 1000
int number[N];
int count=1;
int n;
main()
{   int i;
	scanf("%d",&n);
	for(i=0;i<n;i++) scanf("%d",&number[i]);
	for(i=0;i<n-1;i++)
	{if(number[i+1]!=number[i]) count++;}
	printf("%d\n",count);
	return 0;
}

201512-1 数位之和

试题编号:201512-1
试题名称:数位之和
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  给定一个十进制整数n,输出n的各位数字之和。

输入格式

  输入一个整数n

输出格式

  输出一个整数,表示答案。

样例输入

20151220

样例输出

13

样例说明

  20151220的各位数字之和为2+0+1+5+1+2+2+0=13。

评测用例规模与约定

  所有评测用例满足:0 ≤ n ≤ 1000000000。

#include<stdio.h>
long n;
int sum=0;
int temp;
main()
{ scanf("%ld",&n);
 while(n!=0)
 {temp=n%10;sum+=temp;n=n/10;}
 printf("%d\n",sum);
 return 0;
}

201604-1 折点计数

试题编号:201604-1
试题名称:折点计数
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  给定n个整数表示一个商店连续n天的销售量。如果某天之前销售量在增长,而后一天销售量减少,则称这一天为折点,反过来如果之前销售量减少而后一天销售量增长,也称这一天为折点。其他的天都不是折点。如下图中,第3天和第6天是折点。

  给定n个整数a1, a2, …, an表示销售量,请计算出这些天总共有多少个折点。
  为了减少歧义,我们给定的数据保证:在这n天中相邻两天的销售量总是不同的,即ai-1≠ai。注意,如果两天不相邻,销售量可能相同。

 

 

 

输入格式

  输入的第一行包含一个整数n
  第二行包含n个整数,用空格分隔,分别表示a1, a2, …, an

输出格式

  输出一个整数,表示折点出现的数量。

样例输入

7
5 4 1 2 3 6 4

样例输出

2

评测用例规模与约定

  所有评测用例满足:1 ≤ n ≤ 1000,每天的销售量是不超过10000的非负整数。


#include<stdio.h>
#define N 1000
int n;
int number[N];
int count=0;
main()
{int i;
 scanf("%d",&n);
 for(i=0;i<n;i++) scanf("%d",&number[i]);
  for(i=1;i<=n-2;i++)
  {if((number[i]>number[i-1])&&(number[i]>number[i+1])) count++;
  if((number[i]<number[i-1])&&(number[i]<number[i+1])) count++;}
  printf("%d\n",count);
  return 0;
}

 201609-1 最大波动

试题编号:201609-1
试题名称:最大波动
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  小明正在利用股票的波动程度来研究股票。小明拿到了一只股票每天收盘时的价格,他想知道,这只股票连续几天的最大波动值是多少,即在这几天中某天收盘价格与前一天收盘价格之差的绝对值最大是多少。

输入格式

  输入的第一行包含了一个整数n,表示小明拿到的收盘价格的连续天数。
  第二行包含n个正整数,依次表示每天的收盘价格。

输出格式

  输出一个整数,表示这只股票这n天中的最大波动值。

样例输入

6
2 5 5 7 3 5

样例输出

4

样例说明

  第四天和第五天之间的波动最大,波动值为|3-7|=4。

评测用例规模与约定

  对于所有评测用例,2 ≤ n ≤ 1000。股票每一天的价格为1到10000之间的整数。

#include<stdio.h>
#include<math.h>
#define N 1000
int n;
int number[N];
int max;
main()
{ int i;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&number[i]);
   max=abs(number[1]-number[0]);
      for(i=2;i<n;i++) 
     {if(abs(number[i]-number[i-1])>max)  max=abs(number[i]-number[i-1]);}
	  printf("%d\n",max);
	  return 0;
}

 201612-1 中间数

试题编号:201612-1
试题名称:中间数
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  在一个整数序列a1, a2, …, an中,如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。在一个序列中,可能存在多个下标不相同的中间数,这些中间数的值是相同的。
  给定一个整数序列,请找出这个整数序列的中间数的值。

输入格式

  输入的第一行包含了一个整数n,表示整数序列中数的个数。
  第二行包含n个正整数,依次表示a1, a2, …, an

输出格式

  如果约定序列的中间数存在,则输出中间数的值,否则输出-1表示不存在中间数。

样例输入

6
2 6 5 6 3 5

样例输出

5

样例说明

  比5小的数有2个,比5大的数也有2个。

样例输入

4
3 4 6 7

样例输出

-1

样例说明

  在序列中的4个数都不满足中间数的定义。

样例输入

5
3 4 6 6 7

样例输出

-1

样例说明

  在序列中的5个数都不满足中间数的定义。

评测用例规模与约定

  对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ ai ≤ 1000。

#include<stdio.h>
#define N 1000
int mid;
int x=0;
int y=0;
int n;
int number[N];
main()
{ int i,j;
int flag=1;
 scanf("%d",&n);
 for(i=0;i<n;i++)  scanf("%d",&number[i]);

 for(i=0;i<n;i++)
       {mid=number[i];
        for(j=0;j<n;j++)
		{if(number[j]>mid) x++;
		if(number[j]<mid) y++;}
		if(x==y) {printf("%d\n",mid);flag=0;break;}
		x=0;y=0;
      }
 if(flag==1) printf("-1\n");
 return 0;
}

201703-1  分蛋糕

试题编号:201703-1
试题名称:分蛋糕
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, …, an。小明想分给每个朋友至少重量为k的蛋糕。小明的朋友们已经排好队准备领蛋糕,对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋糕的总重量大于等于k
  请问当小明的蛋糕分完时,总共有多少个朋友分到了蛋糕。

输入格式

  输入的第一行包含了两个整数nk,意义如上所述。
  第二行包含n个正整数,依次表示a1, a2, …, an

输出格式

  输出一个整数,表示有多少个朋友分到了蛋糕。

样例输入

6 9
2 6 5 6 3 5

样例输出

3

样例说明

  第一个朋友分到了前3块蛋糕,第二个朋友分到了第4、5块蛋糕,第三个朋友分到了最后一块蛋糕。

评测用例规模与约定

  对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 10000,1 ≤ ai ≤ 1000。

#include<stdio.h>
#define N 1000
int n,k;
int input[N];
int count=0;
main()
 {int i;
  int flag;
  int temp=0;
  scanf("%d %d",&n,&k);
  for(i=0;i<n;i++) 
  scanf("%d",&input[i]);

  for(i=0;i<n;i++)
  { temp+=input[i];
  if(temp>=k) {count++;temp=0;flag=i;}
  }
  if(flag<n-1) count++;
  
  printf("%d\n",count);
  return 0;
  }

 201709-1 打酱油

试题编号:201709-1
试题名称:打酱油
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  小明带着N元钱去买酱油。酱油10块钱一瓶,商家进行促销,每买3瓶送1瓶,或者每买5瓶送2瓶。请问小明最多可以得到多少瓶酱油。

输入格式

  输入的第一行包含一个整数N,表示小明可用于买酱油的钱数。N是10的整数倍,N不超过300。

输出格式

  输出一个整数,表示小明最多可以得到多少瓶酱油。

样例输入

40

样例输出

5

样例说明

  把40元分成30元和10元,分别买3瓶和1瓶,其中3瓶送1瓶,共得到5瓶。

样例输入

80

样例输出

11

样例说明

  把80元分成30元和50元,分别买3瓶和5瓶,其中3瓶送1瓶,5瓶送2瓶,共得到11瓶。

#include<stdio.h>
int n;
int sum=0;
int a,b,c,d;
main()
 {
	 scanf("%d",&n);
	 a=n/50;
	 sum+=a*7;
	 b=n%50;
	 c=b/30;
	 sum+=c*4;
	 d=b%30;
	 sum+=d/10;
	 printf("%d\n",sum);
	 return 0;

 }

201712-1 最小差值

试题编号:201712-1
试题名称:最小差值
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。

输入格式

  输入第一行包含一个整数n
  第二行包含n个正整数,相邻整数之间使用一个空格分隔。

输出格式

  输出一个整数,表示答案。

样例输入

5
1 5 4 8 20

样例输出

1

样例说明

  相差最小的两个数是5和4,它们之间的差值是1。

样例输入

5
9 3 6 1 3

样例输出

0

样例说明

  有两个相同的数3,它们之间的差值是0.

数据规模和约定

  对于所有评测用例,2 ≤ n ≤ 1000,每个给定的整数都是不超过10000的正整数。

#include<stdio.h>
#include<math.h>
#define N 1000
int n;
int number[N];
int result;
main()
{ int i,j;
  scanf("%d",&n);
  for(i=0;i<n;i++)
	  scanf("%d",&number[i]);

  result=abs(number[0]-number[1]);
  for(i=2;i<n;i++)
	  for(j=0;j<i;j++)
		  if(abs(number[i]-number[j])<result) result=abs(number[i]-number[j]);
  printf("%d\n",result);
  return 0;
}

 201803-1 跳一跳

试题编号:201803-1
试题名称:跳一跳
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  近来,跳一跳这款小游戏风靡全国,受到不少玩家的喜爱。
  简化后的跳一跳规则如下:玩家每次从当前方块跳到下一个方块,如果没有跳到下一个方块上则游戏结束。
  如果跳到了方块上,但没有跳到方块的中心则获得1分;跳到方块中心时,若上一次的得分为1分或这是本局游戏的第一次跳跃则此次得分为2分,否则此次得分比上一次得分多两分(即连续跳到方块中心时,总得分将+2,+4,+6,+8...)。
  现在给出一个人跳一跳的全过程,请你求出他本局游戏的得分(按照题目描述的规则)。

输入格式

  输入包含多个数字,用空格分隔,每个数字都是1,2,0之一,1表示此次跳跃跳到了方块上但是没有跳到中心,2表示此次跳跃跳到了方块上并且跳到了方块中心,0表示此次跳跃没有跳到方块上(此时游戏结束)。

输出格式

  输出一个整数,为本局游戏的得分(在本题的规则下)。

样例输入

1 1 2 2 2 1 1 2 2 0

样例输出

22

数据规模和约定

  对于所有评测用例,输入的数字不超过30个,保证0正好出现一次且为最后一个数字。

#include<stdio.h>
#define N 30
int number[N]={0};
int sum=0;
main()
{
	int temp=0;
	int n;
	int i=0;
	scanf("%d",&n);
	
	while(n!=0)
	{ if(n==1) {sum++;temp=0;}
	  if(n==2)  {temp++;sum+=2*temp;}
	 scanf("%d",&n);
	}
	printf("%d\n",sum);
	return 0;
 }

201809-1 卖菜

试题编号:201809-1
试题名称:卖菜
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜。
  第一天,每个商店都自己定了一个价格。店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己和相邻商店的价格调整自己的价格。具体的,每家商店都会将第二天的菜价设置为自己和相邻商店第一天菜价的平均值(用去尾法取整)。
  注意,编号为1的商店只有一个相邻的商店2,编号为n的商店只有一个相邻的商店n-1,其他编号为i的商店有两个相邻的商店i-1和i+1。
  给定第一天各个商店的菜价,请计算第二天每个商店的菜价。

输入格式

  输入的第一行包含一个整数n,表示商店的数量。
  第二行包含n个整数,依次表示每个商店第一天的菜价。

输出格式

  输出一行,包含n个正整数,依次表示每个商店第二天的菜价。

样例输入

8
4 1 3 1 6 5 17 9

样例输出

2 2 1 3 4 9 10 13

数据规模和约定

  对于所有评测用例,2 ≤ n ≤ 1000,第一天每个商店的菜价为不超过10000的正整数。

#include<stdio.h>
#define N 1000
int price[N];
int new_price[N];
main()
{
	int i;
	int n;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&price[i]);
	for(i=1;i<n-1;i++)
		new_price[i]=(price[i-1]+price[i]+price[i+1])/3;
	new_price[0]=(price[0]+price[1])/2;
	new_price[n-1]=(price[n-2]+price[n-1])/2;
	for(i=0;i<n;i++) printf("%d ",new_price[i]);
	printf("\n");
	return 0;
}

 201812-1 小明上学

试题编号:201812-1
试题名称:小明上学
时间限制:1.0s
内存限制:512.0MB
问题描述:

题目背景

  小明是汉东省政法大学附属中学的一名学生,他每天都要骑自行车往返于家和学校。为了能尽可能充足地睡眠,他希望能够预计自己上学所需要的时间。他上学需要经过数段道路,相邻两段道路之间设有至多一盏红绿灯。
  京州市的红绿灯是这样工作的:每盏红绿灯有红、黄、绿三盏灯和一个能够显示倒计时的显示牌。假设红绿灯被设定为红灯 r 秒,黄灯 y 秒,绿灯 g 秒,那么从 0 时刻起,[0,r) 秒内亮红灯,车辆不许通过;[r, r+g) 秒内亮绿灯,车辆允许通过;[r+g, r+g+y) 秒内亮黄灯,车辆不许通过,然后依次循环。倒计时的显示牌上显示的数字 l(l > 0)是指距离下一次信号灯变化的秒数。

问题描述

  一次上学的路上,小明记录下了经过每段路的时间,和各个红绿灯在小明到达路口时的颜色和倒计时秒数。希望你帮忙计算此次小明上学所用的时间。

输入格式

  输入的第一行包含空格分隔的三个正整数 r、y、g,表示红绿灯的设置。这三个数均不超过 106。
  输入的第二行包含一个正整数 n(n ≤ 100),表示小明总共经过的道路段数和看到的红绿灯数目。
  接下来的 n 行,每行包含空格分隔的两个整数 k、t。k=0 表示经过了一段道路,耗时 t 秒,此处 t 不超过 106;k=1、2、3 时,分别表示看到了一个红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 t,此处 t 分别不会超过 r、y、g。

输出格式

  输出一个数字,表示此次小明上学所用的时间。

样例输入

30 3 30
8
0 10
1 5
0 11
2 2
0 6
0 3
3 10
0 3

样例输出

70

样例说明

  小明先经过第一段道路,用时 10 秒,然后等待 5 秒的红灯,再经过第二段道路,用时 11 秒,然后等待 2 秒的黄灯和 30 秒的红灯,再经过第三段、第四段道路,分别用时6、3秒,然后通过绿灯,再经过最后一段道路,用时 3 秒。共计 10 + 5 + 11 + 2 + 30 + 6 + 3 + 3=70 秒。

评测用例规模与约定

  测试点 1, 2 中不存在任何信号灯。
  测试点 3, 4 中所有的信号灯在被观察时均为绿灯。
  测试点 5, 6 中所有的信号灯在被观察时均为红灯。
  测试点 7, 8 中所有的信号灯在被观察时均为黄灯。
  测试点 9, 10 中将出现各种可能的情况。

#include<stdio.h>
#define N 100
int input[N][2];
int time=0;
int r,y,g;
int n;
main()
{ 
	int i,j;
	scanf("%d %d %d",&r,&y,&g);
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d %d",&input[i][0],&input[i][1]);
	for(i=0;i<n;i++)
	{if(input[i][0]==0) time+=input[i][1];
	if(input[i][0]==1) time+=input[i][1];
	if(input[i][0]==2) time+=input[i][1]+r;
	}
	printf("%d\n",time);
	return 0;
}

201903-1 小中大

试题编号:201903-1
试题名称:小中大
时间限制:1.0s
内存限制:512.0MB
问题描述:

 

#include<stdio.h>
#define N 100000
int n;
int max,min;
int mid1;
float mid2;
int number[N];
int temp;
main()
{
	int i;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	scanf("%d",&number[i]);
	max=number[0];min=number[n-1];
	if(min>max) {temp=max;max=min;min=temp;}
	if(n%2==1) 
	{printf("%d %d %d\n",max,number[n/2],min);}
	else 
	{  
		if((number[n/2-1]+number[n/2])%2==0)
		{mid1=(number[n/2-1]+number[n/2])/2;
			printf("%d %d %d\n",max,mid1,min);}
		else 
		{mid2=(float)((number[n/2-1]+number[n/2])/2.0);
			printf("%d %.1f %d\n",max,mid2,min);}
	}
	return 0;
}

 201909-1 小明种苹果

试题编号:201909-1
试题名称:小明种苹果
时间限制:2.0s
内存限制:512.0MB
问题描述:

 

#include<stdio.h>
int n,m,k;
int sum=0;
int max=0,temp,flag;
main()
{
	int i,j;
	scanf("%d %d",&n,&m);
	for(i=0;i<n;i++)
	{
	  scanf("%d",&k);
	  sum+=k;
	   for(j=0;j<m;j++)
	    {
			scanf("%d",&k);
			sum+=k;
			temp+=k;
	     }
	   if(-temp>max) {max=-temp;flag=i+1;}
	   temp=0;
	}
	printf("%d %d %d\n",sum,flag,max);
	return 0;
  }

 201912-1 报数

试题编号:201912-1
试题名称:报数
时间限制:1.0s
内存限制:512.0MB
问题描述:

 

#include<stdio.h>
int a=0,b=0,c=0,d=0;
int n;


int have7(int num)
{while(num)
if(num%10==7) return 1;
else num=num/10;
return 0;
}


main()
{int i=1;int count=1;
  scanf("%d",&n);

  while(count<=n)
 {if((i%7==0)||have7(i))
   { if(i%4==1) a++;
     if(i%4==2) b++;
	 if(i%4==3) c++;
	 if(i%4==0) d++; }
 else count++;
 i++;
   }  
  printf("%d\n",a);
  printf("%d\n",b);
  printf("%d\n",c);
  printf("%d\n",d);
  return 0;
}

 

 202009-1 称检测点查询

 

#include<stdio.h>
#include<math.h>
#define N 200
int n,X,Y;
int input[N][2];
int s[N];int sort[N];
int temp1,temp2;
int min,max;
int num;
main()
  {
	  int i,j;
	  scanf("%d %d %d",&n,&X,&Y);
	  for(i=1;i<=n;i++)
	  {scanf("%d %d",&input[i][0],&input[i][1]);
	  s[i]=(input[i][0]-X)*(input[i][0]-X)+(input[i][1]-Y)*(input[i][1]-Y);
	  sort[i]=i;}
	
		  for(i=1;i<=n;i++)
			  {
				  for(j=i+1;j<=n;j++)
			       {
				     if(s[j]<s[i]) 
			          {temp1=s[j];s[j]=s[i];s[i]=temp1;
		                temp2=sort[j];sort[j]=sort[i];sort[i]=temp2;}
		             if(s[i]==s[j])
		                  {if(sort[i]>sort[j])
					 {temp2=sort[j];sort[j]=sort[i];sort[i]=temp2;}
					 }
		  }
		  }
		  for(i=1;i<=3;i++)
		  printf("%d\n",sort[i]);
		  return 0;
	    

  }

202012-1 期末预测之安全指数

#include<stdio.h>
#define N 100000
int n,y;
int sum=0;
int input[N][2];
main()
{
	int i;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		{scanf("%d %d",&input[i][0],&input[i][1]);
	     sum+=input[i][0]*input[i][1];}
	if(sum<0) y=0;
	else y=sum;
	printf("%d\n",y);
	return 0;

   }

 

202104-1 灰度直方图 

#include<stdio.h>
#define N 500
#define L 256
int input[N][N];
int h[L]={0};
int n,m,l;
main()
{
	int i,j;
	scanf("%d %d %d",&n,&m,&l);
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
		{scanf("%d",&input[i][j]);
	     h[input[i][j]]++;}
	for(i=0;i<l;i++)
		printf("%d ",h[i]);
	printf("\n");
	return 0;
   }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值