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助手
