洛谷刷题C语言:CRNE、CETIRI、PRASE

记录洛谷刷题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 1n100

说明

题目译自 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 100100 之间。

输出格式

输出一行一个数,为第四个数。

方案可能不是唯一的,但保证一定存在,本题使用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 1n100
  • 1 ≤ ∣ s i ∣ ≤ 20 1 \leq |s_i| \leq 20 1si20 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 市,限行规则如下:

  1. 对于外来车(即前三位编号非 MDA),工作日(星期一至星期五)均限行。
  2. 对于其他本地车,每天会限行某些尾号的汽车。星期一至星期五的限行尾号如下:
日期星期一星期二星期三星期四星期五
限行尾号 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 1a,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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值