Advertisement

2016年蜀山区第十五届青少年信息学竞赛

阅读量:

201********6 年蜀山区第十五届青少年信息学竞赛

小学组试题

一、题目概况

题目名称 求差 生日 抓牛 工资
文件名 sub birthday catchcow money
输入文件名 sub.in birthday.in catchcow.in money.in
输出文件名 sub.out birthday.out catchcow.out money.out
满分 100 100 100 100
时间限制 1s 1s 1s 1s
空间限制 256MB 256MB 256MB 256MB

二、注意事项

务必看清题目,严格按照所要求的格式输入、输出。

在调试程序时请先使用题目中的示例数据,然后再自行设计多组测试数据进行调试。

每题一般有10个测试点,测试有严格的时间限制,请尽可能优化算法。

命名规则:

(1)每题都规定了该题的英文名称。

(2)程序文件和数据文件的主文件名都是该题的英文名字。

(3)程序文件扩展名采用语言环境的默认扩展名。

(4)数据文件都是文本文件,输入和输出文件的扩展名分别是.in和.out。

程序应从输入文件读取数据,并严格地按照规定的输出格式将结果输出到输出文件中。输入数据文件和输出数据文件都与程序在同一个目录中,由于程序所在目录是不确定的,因此不允许在文件名中含有盘符信息和任何形式的路径信息。

选手应在指定分区的根目录下建立以准考证号命名的文件夹,并将所完成各题的源程序文件拷贝到该文件夹中。

竞赛时间:2016年11月3日(星期四)下午2:30-5:00(地点:合肥市华府骏苑小学)

第一题 求差

(sub**.pas/c/cpp****)**

【问题描述】

给定两个整数a,b,求a-b的值。

【输入格式】

一行,给定两个整数a,b

【输出格式】

一行,a-b的结果。

【样例输入】

3 2

【样例输出】

1

【数据范围】

0≤a,b≤2100000000

复制代码
 #include<iostream>

    
 using namespace std;
    
 int main(){
    
     long long a,b;
    
     cin>>a>>b;
    
     cout<<a-b;
    
     return 0;
    
 }
    
    
    
    
    AI助手

第二题 生日

birthday.pas/c/cpp

【问题描述】

小甜甜的生日是YY年MM月DD日,她想知道自己出生后第一万天纪念日的日期(出生日算第0天)。

【输入格式】

从文件的第一行分别读入YY,MM,DD其中1949<=YY<=2016,日期绝对合法。

【输出格式】

输出文件只有一行,即小甜甜生日第一万天以后的日期,格式为 “YY-MM-DD”。

【样例输入】

2016 10 31

【样例输出】

2044-3-18

复制代码
 #include<bits/stdc++.h>

    
 using namespace std;
    
  
    
 #define TT 10000 
    
 int yy, mm, dd;//yy-年;mm-月;dd-天 
    
 int days;//累加天数 
    
 int month[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
 int y, m, d;//目标 
    
  
    
 //判断是否是闰年
    
 int isRun(int year){
    
     if((year%4==0&&year%100!=0)||year%400==0){
    
     return 1;
    
     }
    
     return 0; 
    
 } 
    
  
    
 //计算一年一共有多少天
    
 int dayForYear(int year){
    
     int res=0;
    
     if(isRun(year)){
    
     month[2]=29;
    
     }else{
    
     month[2]=28;
    
     }
    
     for(int i=1; i<=12; i++){
    
     res += month[i];
    
     }
    
     return res;
    
 } 
    
  
    
 int main(){
    
 	int i; 
    
     cin>>yy>>mm>>dd;//输入
    
     
    
     if(isRun(yy)){
    
     month[2]=29;//闰年 
    
     }
    
     days=month[mm]-dd;//离当月结束还有多少天
    
     //此时days为今年结束还剩多少天
    
     for(i=mm+1; i<=12; i++){
    
     days += month[i];
    
     }
    
     
    
     //求年份
    
     y=yy;
    
     for(y=yy+1; y<30000; y++){
    
     if(days+dayForYear(y)<TT){
    
         days+=dayForYear(y);
    
     }else{
    
         break;
    
     }
    
     }
    
     //求月份
    
     for(m=1; m<=12; m++){
    
     if(days+month[m]<TT){
    
         days+=month[m];
    
     }else{
    
         break;
    
     }
    
     } 
    
  
    
     d=TT-days;
    
     cout<<y<<"-"<<m<<"-"<<d<<endl;
    
     return 0;
    
 } 
    
    
    
    
    AI助手

第三题 抓牛

(catchcow.pas**/**cpp/c)

【问题描述】

农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来.

他们都站在数轴上.约翰在N(O≤N≤100000)处,奶牛在K(O≤K≤100000)处.约翰有两种办法移动,步行和瞬移:步行每秒种可以让约翰从x处走到x+l或x-l处;而瞬移则可让他在1秒内从x处消失,在2x处出现.然而那只逃逸的奶牛,悲剧地没有发现自己的处境多么糟糕,正站在那儿一动不动.

那么,约翰需要多少时间抓住那只牛呢?

【输入格式】

仅有两个整数N和K

【输出格式】

最短时间

【样例输入】

5 17

【样例输出】

4

复制代码
 #include<iostream>

    
 using namespace std;
    
 int main(){
    
     int n,k;
    
     cin>>n>>k;
    
     int m=(k-n)/n,a=(k-n)%n,b=n-a;
    
     int ans=m+min(a,b);
    
     cout<<ans;
    
     return 0;
    
 }
    
    
    
    
    AI助手

第四题 工资

(money**.pas/c/cpp****)**

【问题描述】

聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi。有m个结算工钱的时间,聪哥可以自由安排这些时间,也就是说什么时候拿钱,老板说的不算,聪哥才有发言权!(因为聪哥是土豪,他是老板的老板)

聪哥不喜欢身上一次性有太多的钱,于是他想安排一下拿钱的时间,使他一次性拿的钱中最大的最小。(最后一天一定要领钱)

【输入格式】

第一行 2个数 n,m

接下来n行,每行一个数,代表Vi.

【输出格式】

最小的最大钱数。

【样例输入】

7 5

100

400

300

100

500

101

400

【样例输出】

500

【样例说明】

100 400//300 100//500//101//400//

“//”表示老大要去拿钱。

【数据范围】

对于20%的数据,1<=n<=20

对于40%的数据,1<=n<=50,Vi的和不超过1000

对于100%的数据,1<=n<=100,000,m<=n,Vi<=10,000

复制代码
 //https://www.cnblogs.com/gc812/articles/7236076.html

    
 //二分 评测:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1532 
    
 /*
    
 https://www.luogu.com.cn/problem/P1182
    
 给你N个数,把他们分割成最多m个部分,每个部分的数字总和为sum[i],
    
 求一种分割方法使得sum[i]的最大值尽量小
    
 */
    
 #include<bits/stdc++.h>
    
 using namespace std;
    
 int n, m;
    
 int v[100005], ans;
    
 bool check(int x){
    
 	int he=0;
    
 	int cnt=1;//分的段数(最后得拿)
    
 	for(int i=0; i<n; i++){
    
 		he=he+v[i];
    
 		if(he>x){
    
 			he=v[i];
    
 			cnt++;
    
 		}
    
 		if(cnt>m) return 0;
    
 	} 
    
 	return  1;
    
 }
    
 int main(){
    
 	int z=0, y=0, mid, qaq=0;
    
 	cin>>n>>m;
    
 	for(int i=0; i<n; i++){
    
 		scanf("%d", &v[i]);
    
 		y=y+v[i];
    
 		qaq=max(qaq, v[i]);//v的最大值(一次一取) 
    
 	}
    
 	while(z<=y){
    
 		mid=z+(y-z)/2;//二分
    
 		if(check(mid)){//说明可以大了 
    
 			ans=mid;
    
 			y=mid-1; 
    
 		}else{
    
 			z=mid+1;
    
 		} 
    
 	}
    
 	cout<<max(ans, qaq)<<endl; 
    
 	return 0;
    
 } 
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
    
    
    
    AI助手

全部评论 (0)

还没有任何评论哟~