记录洛谷刷题QAQ
一、[COCI2007-2008#2] CRNE
题目描述
在一个矩形棋盘上,切与矩形的边平行的 n n n 次,问最多棋盘能被切成多少块?
输入格式
输入一行一个整数 n n n。
输出格式
输出一行一个整数表示棋盘最多被分成的块数。
样例 #1
样例输入 #1
1
样例输出 #1
2
样例 #2
样例输入 #2
3
样例输出 #2
6
提示
数据规模与约定
对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 100 1\le n\le 100 1≤n≤100。
说明
题目译自 COCI2007-2008 CONTEST #2 T2 CRNE。
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
printf("%d\n",(n/2 +1)*(n - n/2 +1));
return 0;
}
二、[COCI2007-2008#3] CETIRI
题目描述
你原本有 4 4 4 个数,它们从小到大排序后构成了等差数列。
但是现在丢失了一个数,并且其余的三个数的顺序也被打乱了。
请你找出第四个数。
输入格式
输入一行三个整数。保证这些数字在 − 100 ∼ 100 -100\sim 100 −100∼100 之间。
输出格式
输出一行一个数,为第四个数。
方案可能不是唯一的,但保证一定存在,本题使用SPJ。
样例 #1
样例输入 #1
4 6 8
样例输出 #1
10
样例 #2
样例输入 #2
10 1 4
样例输出 #2
7
提示
说明
题目译自 COCI2007-2008 CONTEST #3 T1 CETIRI。
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
int a, b, c;
scanf("%d%d%d",&a,&b,&c);
int min, mid, max;
if(a > b&&a > c) max = a;
if(b > c&&b > a) max = b;
if(c > a&&c > b) max = c;
if(a < b&&a < c) min = a;
if(b < c&&b < a) min = b;
if(c < a&&c < b) min = c;
mid = a + c + b - min - max;
int x = mid - min;
int y = max - mid;
if(x == y*2)
{
printf("%d\n",mid - y);
}
if(y == x*2)
{
printf("%d\n",mid + x);
}
if(x == y)
{
printf("%d\n",max + x);
}
return 0;
}
三、[COCI2006-2007#6] PRASE
题目描述
孩子们正在餐桌旁吃午餐,共有 n n n 份食物,孩子们会按照从 1 1 1 至 n n n 的顺序依次取走这 n n n 份食物。
当某个孩子取走了一份食物时,如果这个他之前已经取走的食物份数(不包括当前这一份)比其他人取走的食物份数之和还要多,那么他的妈妈就会提醒他注意自己不礼貌的行为。注意,虽然被妈妈提醒了,但是他仍然会取走这份食物。换句话说,妈妈的提醒对孩子的行为没有任何影响。
给定 n n n 份食物分别被哪个孩子取走了,请求出妈妈们一共提醒了多少次。
输入格式
第一行是一个整数,代表食物的份数 n n n。
第 2 2 2 到第 ( n + 1 ) (n + 1) (n+1) 行,每行一个字符串,第 ( i + 1 ) (i + 1) (i+1) 行的字符串 s i s_i si 表示取走第 i i i 份食物的孩子的名字。
输出格式
输出一行一个整数表示答案。
样例 #1
样例输入 #1
4
mirko
stanko
stanko
stanko
样例输出 #1
1
样例 #2
样例输入 #2
17
a
b
b
a
a
a
c
a
b
b
c
b
b
b
b
b
b
样例输出 #2
4
提示
样例 1 解释
当取到第 3 3 3 份食物时,stanko 已取走的食物(不包括当前这份)的份数是一份,而其他人也总共取走了一份,所以 stanko 的妈妈不会提醒他注意礼貌。
当取到第 4 4 4 份食物时,stanko 已经取走两份食物,其他人总共取走了一份食物,因此妈妈会提醒他。
数据规模与约定
对于全部的测试点,保证:
- 1 ≤ n ≤ 100 1 \leq n \leq 100 1≤n≤100
- 1 ≤ ∣ s i ∣ ≤ 20 1 \leq |s_i| \leq 20 1≤∣si∣≤20, s i s_i si 中只含小写英文字母。 ∣ s i ∣ |s_i| ∣si∣ 表示字符串 s i s_i si 的长度。
说明
题目译自 COCI2006-2007 CONTEST #6 T1 PRASE。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,temp,ans;
string a[101];
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
temp=0;
cin>>a[i];
for(int j=0;j<i;j++)
{
if(a[i]==a[j])
temp++;
}
if(2*temp>i)
ans++;
}
printf("%d",ans);
return 0;
}
四、『MdOI R2』Car
题目描述
在 MdOI 市,为了推行环保,在城区内将限制某些车辆的通行,简称限行。一辆车是否被限行的依据是车牌号和当天的日期。
车牌号的编码方式是这样的:
-
前三位均为大写字母,表示所在的地区。
-
后五位为大写字母或数字,为识别码。保证至少有一个数字。
-
车牌号的尾号是从右往左的第一个数字。
MdOI 市在本题的编码方式下前三位是 MDA
。例如,MdOI 市有一辆识别码为 6780P
的车,它的车牌号就是 MDA6780P
,尾号是
0
0
0。
在 MdOI 市,限行规则如下:
- 对于外来车(即前三位编号非
MDA
),工作日(星期一至星期五)均限行。 - 对于其他本地车,每天会限行某些尾号的汽车。星期一至星期五的限行尾号如下:
日期 | 星期一 | 星期二 | 星期三 | 星期四 | 星期五 |
---|---|---|---|---|---|
限行尾号 | 1 1 1 和 9 9 9 | 2 2 2 和 8 8 8 | 3 3 3 和 7 7 7 | 4 4 4 和 6 6 6 | 5 5 5 和 0 0 0 |
小 C 告诉了你她的车牌号,她想知道,她的车在星期一到星期五中的哪些日期会被限行。请你帮帮她。
输入格式
一行一个长度为 8 8 8 的字符串,表示小 C 的车牌号。
输出格式
输出 5 5 5 个数字,每个数字为 0 0 0 或 1 1 1,分别表示星期一至星期五小 C 的车是否被限行。 1 1 1 表示限行, 0 0 0 表示不限行。
样例 #1
样例输入 #1
MDA7U16D
样例输出 #1
0 0 0 1 0
样例 #2
样例输入 #2
ZJOI2020
样例输出 #2
1 1 1 1 1
提示
【帮助与提示】
为方便选手调试代码,本题额外提供三组样例。由于样例较小,故放在一个剪贴板内。
【样例解释】
对于样例一,这个车牌号前三位为 MDA
,因此是本地车牌。而尾号是
6
6
6,因此周四被限行。
对于样例二,这个车牌号前三位为 ZJO
,是外地车牌,因此周一至周五均被限行。
【数据范围】
本题采用捆绑测试,即通过一个子任务的所有测试点才能拿到对应的分数。
子任务编号 | 特殊性质 | 分值 |
---|---|---|
Subtask 1 | 前
3
3
3 位不是MDA | 30 30 30 |
Subtask 2 | 最后一位一定是数字 | 30 30 30 |
Subtask 3 | 无 | 40 40 40 |
对于所有数据,满足前三位一定是大写英文字母,后面五位可能包含大写字母或者数字,且至少有一个数字。
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
char num[8];
scanf("%s",&num);
if(num[0] == 'M'&&num[1] == 'D'&&num[2] =='A'){
for(int i = 7;i >= 0;i--)
{
if(num[i] <= '9'&&num[i] >= '0')
{
if(num[i] == '1'||num[i] == '9')
{
printf("1 0 0 0 0\n");
break;
}
else if(num[i] == '2'||num[i] == '8')
{
printf("0 1 0 0 0\n");
break;
}
else if(num[i] == '3'||num[i] == '7')
{
printf("0 0 1 0 0\n");
break;
}
else if(num[i] == '4'||num[i] == '6')
{
printf("0 0 0 1 0\n");
break;
}
else if(num[i] == '5'||num[i] == '0')
{
printf("0 0 0 0 1\n");
break;
}
}
}
}
else
{
printf("1 1 1 1 1\n");
}
return 0;
}
五、[COCI2007-2008#4] VAUVAU
题目描述
在一个小村子里,邮递员、送奶工、垃圾清理工每天早晨都面临着同样的难题:18 号房子的门前有两条看门狗。他们所不知道的是,这两条狗的表现是有迹可循的。
当一天开始时,其中一条狗会先暴躁 a a a 分钟,然后安静 b b b 分钟,而另一条狗则会先暴躁 c c c 分钟,然后安静 d d d 分钟。这两条狗在一天中会无限地重复上述行为。
给定这三个人到达 18 号房子的时刻,请求出该时刻有几条狗是处于暴躁状态的。
输入格式
第一行有四个整数,分别表示 a , b , c , d a, b, c, d a,b,c,d,其意义见【题目描述】。
第二行有三个整数,分别表示邮递员到达的时刻 p p p,送奶工到达的时刻 m m m 和垃圾清理工到达的时刻 g g g。
输出格式
输出三行每行一个字符串,依次表示邮递员、送奶工、垃圾清理工到达时有几条狗处于暴躁状态。
- 如果没有狗处于暴躁状态,输出
none
。 - 如果恰好有一条狗处于暴躁状态,输出
one
。 - 如果两条狗都处于暴躁状态,输出
both
。
样例 #1
样例输入 #1
2 2 3 3
1 3 4
样例输出 #1
both
one
none
样例 #2
样例输入 #2
2 3 4 5
4 9 5
样例输出 #2
one
none
none
提示
数据规模与约定
对于全部的测试点,保证 1 ≤ a , b , c , d , p , m , g < 1 0 3 1 \leq a, b, c, d, p, m, g \lt 10^3 1≤a,b,c,d,p,m,g<103。
说明
题目译自 COCI2007-2008 CONTEST #4 T1 VAUVAU。
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
int a, b, c, d;
scanf("%d%d%d%d",&a,&b,&c,&d);
int p, m, g;
scanf("%d%d%d",&p,&m,&g);
int x = 0, y = 0;
if(p%(a+b) <= a&&p%(a + b) != 0){
x = 1;
}
if(p%(c+d)<=c&&p%(c + d)!= 0)
{
y = 1;
}
if(x == 1&&y == 1)
{
printf("both\n");
}
if(x == 0&&y == 0)
{
printf("none\n");
}
else if(x + y == 1)
{
printf("one\n");
}
x = 0, y = 0;
if(m%(a+b)<=a&&m%(a +b)!=0)
{
x = 1;
}
if(m%(c+d)<=c&& m%(c+d)!=0)
{
y = 1;
}
if(x == 1&&y == 1)
{
printf("both\n");
}
if(x == 0&&y == 0)
{
printf("none\n");
}
else if(x + y == 1)
{
printf("one\n");
}
x = 0, y = 0;
if(g%(a+b)<=a&&g%(a+b)!=0)
{
x = 1;
}
if(g%(c+d)<=c&&g%(a+b)!=0)
{
y = 1;
}
if(x == 1&&y == 1)
{
printf("both\n");
}
if(x == 0&&y == 0)
{
printf("none\n");
}
else if(x + y == 1)
{
printf("one\n");
}
return 0;
}