记录洛谷刷题QAQ
一、[COCI2008-2009#3] PET
题目描述
在一项受欢迎的比赛 Dinner for Five 中,有 5 5 5 名选手和 4 4 4 名裁判,这 4 4 4 个裁判会对每一道菜用 1 ∼ 5 1 \sim 5 1∼5 的数字进行评估,每位选手的总分即是所有裁判评分的总和,参赛者按照其评分顺序从 1 1 1 到 5 5 5 进行编号。
请你编写一个程序,输出评分最高的选手的编号以及其分数。
输入格式
输入共 5 5 5 行,每一行有 4 4 4 个正整数,表示每位裁判对第 i i i 位选手的评分。
输入数据将确保胜者是唯一的。
输出格式
输出仅 1 1 1 行,有 2 2 2 个正整数,中间有一个空格,分别表示评分最高的选手以及其分数。
样例 #1
样例输入 #1
5 4 4 5
5 4 4 4
5 5 4 4
5 5 5 4
4 4 4 5
样例输出 #1
4 19
样例 #2
样例输入 #2
4 4 3 3
5 4 3 5
5 5 2 4
5 5 5 1
4 4 4 4
样例输出 #2
2 17
提示
说明
题目译自 COCI2008-2009 CONTEST #3 T1 PET。
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
int max = 0;
int num = 0;
for(int i = 1;i <= 5;i++)
{
int a, b, c, d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a + b+c+d > max)
{
num = i;
max = a+b+c+d;
}
}
printf("%d %d\n",num,max);
return 0;
}
二、[COCI2008-2009#3] KEMIJA
题目背景
Luka 天天上课走神。
题目描述
Luka 又在化学课上鬼混了!他不是在写平衡方程,而是在写一句奇怪的话。
Luka 通过在每一个元音字母( a \texttt{a} a, e \texttt{e} e, i \texttt{i} i, o \texttt{o} o, u \texttt{u} u)后面加上 p \texttt{p} p 再加上原来的元音字母的方式加密这一个单词,如 kemija \texttt{kemija} kemija 变成 kepemipijapa \texttt{kepemipijapa} kepemipijapa, paprika \texttt{paprika} paprika 变成 papapripikapa \texttt{papapripikapa} papapripikapa 。
老师想知道调皮的 Luka 写了些什么,请你帮助老师,写出一个解密程序。
输入格式
一行一个字符串 s s s,表示加密后的句子,数据保证不会有前导空格与尾随空格,但句子中间可能出现空格。
输出格式
一行一个字符串,表示解密后的句子。
样例 #1
样例输入 #1
zepelepenapa papapripikapa
样例输出 #1
zelena paprika
样例 #2
样例输入 #2
bapas jepe doposapadnapa opovapa kepemipijapa
样例输出 #2
bas je dosadna ova kemija
提示
数据范围
令 ∣ s ∣ |s| ∣s∣ 为 s s s 的长度,则 1 ≤ ∣ s ∣ ≤ 100 1 \leq |s| \leq 100 1≤∣s∣≤100,数据保证字符串的内容一定是小写字母或空格。
说明
题目译自 COCI2008-2009 CONTEST #3 T2 KEMIJA。
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
char num[1001];
// scanf("%s",&num);
gets(num);
int len = strlen(num);
for(int i = 0;i < len;i++)
{
if(num[i] == 'a'||num[i] == 'e'||num[i] == 'i'||num[i] == 'o'||num[i] == 'u')
{
num[i+2] = '0';
num[i+1] = '0';
}
}
for(int i = 0;i < len;i++)
{
if(num[i] != '0')
{
printf("%c",num[i]);
}
}
return 0;
}
三、[COCI2014-2015#1] PROSJEK
题目描述
有一个数列 a a a,现在按照下列公式求出一个数列 b b b:
b i = ∑ j = 1 i a j i b_i=\frac{ \sum^i_{j=1} a_j }{i} bi=i∑j=1iaj
给你数列 b b b,请求出数列 a a a。
输入格式
第一行一个整数 n n n ,表示数列 b b b 的长度。
接下来一行 n n n 个整数,表示数列 b b b。
输出格式
一行 n n n 个整数,表示数列 a a a。
样例 #1
样例输入 #1
1
2
样例输出 #1
2
样例 #2
样例输入 #2
4
3 2 3 5
样例输出 #2
3 1 5 11
样例 #3
样例输入 #3
5
1 2 2 3 4
样例输出 #3
1 3 2 6 8
提示
样例输入输出 3 解释
当数列 a = 1 , 3 , 2 , 6 , 8 a=1,3,2,6,8 a=1,3,2,6,8 时,数列 b = 1 1 , 1 + 3 2 , 1 + 3 + 2 3 , 1 + 3 + 2 + 6 4 , 1 + 3 + 2 + 6 + 8 5 b=\frac{1}{1},\frac{1+3}{2},\frac{1+3+2}{3},\frac{1+3+2+6}{4},\frac{1+3+2+6+8}{5} b=11,21+3,31+3+2,41+3+2+6,51+3+2+6+8,即 b = 1 , 2 , 2 , 3 , 4 b=1,2,2,3,4 b=1,2,2,3,4。
数据规模与约定
对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 100 1\le n\le 100 1≤n≤100, 1 ≤ a i , b i ≤ 1 0 9 1\le a_i,b_i\le 10^9 1≤ai,bi≤109。
说明
本题总分 50 50 50 分。
本题译自 Croatian Open Competition in Informatics 2014/2015 Contest #1 T1 PROSJEK。
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int num[n+1];
for(int i = 1;i <= n;i++)
{
scanf("%d",&num[i]);
}
int NUM[n+1];
for(int i = 1;i <= n;i++)
{
NUM[i] = i*num[i];
for(int j = 1;j < i;j++)
{
NUM[i] = NUM[i] -NUM[j];
}
}
for(int i = 1;i <= n;i++)
{
printf("%d ",NUM[i]);
}
return 0;
}
三、[COCI2008-2009#2] KORNISLAV
题目描述
乌龟 Kornislav 从来没有什么有趣的事。 由于他将生活三百年,他一直在努力寻找消磨时间的方法。 这个周末,他开始玩“面积最大的矩形”这个游戏。
首先,Kornislav 需要四个正整数。他通过向一个方向移动,旋转
90
°
90°
90° ,在新方向上行走等方式来形成一个图案。Kornislav 总共进行了三个
90
°
90°
90° 旋转,并走过了四条线段。
当朝某个方向行走时,他的步数必须等于四个所选整数中的一个,并且每个整数只能成为一条线段的长度。根据 Kornislav 使用这四个整数的顺序,他的步行将形成各种形状,其中也包括一些未封闭的图案。
编写一个程序,计算出乌龟的行进轨迹可以形成的最大矩形面积。
输入格式
一行四个整数 a , b , c , d a,b,c,d a,b,c,d,表示 Kornislav 挑选的四个整数。
输出格式
一行一个整数,表示 Kornislav 的行进轨迹所能形成的最大矩形面积。
样例 #1
样例输入 #1
1 2 3 4
样例输出 #1
3
样例 #2
样例输入 #2
4 4 3 4
样例输出 #2
12
提示
数据规模与约定
对于 100 % 100\% 100% 的数据,有 1 < a , b , c , d < 100 1<a,b,c,d<100 1<a,b,c,d<100。
说明
题目译自 COCI2008-2009 CONTEST #2 KORNISLAV,译者 @mnesia。
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
int num[4];
for(int i= 0;i < 4;i++)
{
scanf("%d",&num[i]);
}
for(int i = 0;i < 4;i++)
{
for(int j = i+1;j < 4;j++)
{
if(num[i] > num[j])
{
num[i] = num[i] + num[j];
num[j] = num[i] - num[j];
num[i] = num[i] - num[j]; }
}
}
int max;
max = num[0] * num[2];
printf("%d\n",max);
return 0;
}
五、[COCI2008-2009#2] RESETO
题目描述
埃拉托色尼筛法是一种著名的素数筛法,可以查找所有直至 n n n 的素数。该算法的步骤是:
- 写下 2 2 2 到 n n n 之间的所有整数(包括 2 2 2 和 n n n)。
- 找到尚未删除的最小数,并将其命名为 p p p; 则 p p p 是素数。
- 划掉 p p p 及其所有尚未划掉的倍数。
- 如果尚有数未被划掉,请转到步骤 2 2 2。
编写一个程序,给定 n n n 和 k k k,找出第 k k k 个被删除的整数。
输入格式
一行两个整数 n n n 和 k k k,其具体含义请见题目描述。
输出格式
一行一个整数,表示第 k k k 个被划掉的整数。
样例 #1
样例输入 #1
7 3
样例输出 #1
6
样例 #2
样例输入 #2
15 12
样例输出 #2
7
样例 #3
样例输入 #3
10 7
样例输出 #3
9
提示
数据规模与约定
对于 100 % 100\% 100% 的数据,有 2 ≤ k < n ≤ 1000 2 \leq k < n \leq 1000 2≤k<n≤1000。
说明
题目译自 COCI2008-2009 CONTEST #2 RESETO,译者 @mnesia。
代码如下:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int p[2000]; //是否是素数,一开始全部设为0.
int main(){
int n,k;
scanf("%d%d",&n,&k);
int t[2000]; //被划掉的数。
int s=1;
for(int i=2;i<=n;i++){
if(p[i]==0){ //如果这个数是素数。
for(int j=i;j<=n;j+=i){ //由于这个素数本身也要划掉,所以从i开始。
if(p[j]==1) continue; //为了避免重复计算,需要特判。
p[j]=1; //这个数是合数。
t[s++]=j;
}
}
}
printf("%d",t[k]);
return 0;
}