记录洛谷刷题QAQ
Veronica 在音乐学院上学,她拿到了一张只有音符的乐谱,并且需要识别其所使用的音阶。
在这个问题中,我们只考虑 A 小调和 C 大调。其中 A 小调音阶为 { A , B , C , D , E , F , G } \{ A,B,C,D,E,F,G \} {A,B,C,D,E,F,G},C 大调音阶为 { C , D , E , F , G , A , B } \{ C,D,E,F,G,A,B \} {C,D,E,F,G,A,B}。
称每个音阶的第一个、第四个和第五个音为主调,你需要判断给定的乐谱是 A 小调或是 C 大调。
判断方法:判断此乐谱中每个小节的第一个音符,是 A 小调的主调或是 C 大调的主调,最后判断哪个音阶的主音个数更多。如果两者个数一样多,取整个乐谱的最后一个音符所属的音阶。
最后一个音符为 A 则属于 A 小调,否则属于 C 大调
输入共一行,一个字符串,表示给出的乐谱,保证给出的乐谱中只包含 ${ $A
,B
,C
,D
,E
,F
,G
,|
} \} },其中 |
用来分割小节。
输出共一行,一个字符串 C-dur
表示 C 大调,或 A-mol
表示 A 小调。
AEB|C
C-dur
CD|EC|CD|EC|EF|G|EF|G|GAGF|EC|GAGF|EC|CG|C|CG|C
C-dur
【样例解释#1】
两个小节的第一个音符分别为 A
和 C
,由于两个音阶的主调个数相同,取后出现的 C
,即 C 大调。
【数据范围】
对于 100 % 100\% 100% 的数据,保证 5 ≤ 5\le 5≤ 乐谱长度 ≤ 100 \le100 ≤100,且给出的乐谱合法。
【说明】
本题分值按 COCI 原题设置,满分 50 50 50。
题目译自 COCI2012~2013 CONTEST #5 T1 LJESTVICA 。
#include
#include
#include
#include
int main(){
char a[1001];
scanf("%s",&a);
int n=strlen(a),x=0,y=0;//x计C调主调的个数,y计A调主调的个数
for(int i=0;i<=n-1;i++){
if(i==0 || a[i-1]=='|'){//判断是不是每个小节的第一个,注意a[0]也是
if(a[i]=='C' || a[i]=='F' || a[i]=='G') x++;//C调主调
if(a[i]=='A' || a[i]=='D' || a[i]=='E') y++;//A调主调
}
}
if(x>y) printf("C-dur\n");
if(x<y) printf("A-mol\n");
if(x==y){//若主调个数相等
//查看最后一个字符
if(a[n-1]=='C') printf("C-dur\n");
else printf("A-mol\n");
}
return 0;
}
Hansel 和 Gretel 得到了一块分成 8 8 8 片的披萨,每片上面有不同数量的蘑菇,表示为 S 1 , S 2 , . . . , S 8 S_1,S_2,...,S_8 S1,S2,...,S8。Gretel 很喜欢蘑菇,她想要找到连续的四片披萨使得上面的蘑菇最多。
一共 8 8 8 行,每行一个正整数 S i S_i Si( i i i 为行数),表示披萨片上的蘑菇数。
一行一个正整数,表示连续的四片披萨上最多有几个蘑菇。
5
2
1
4
5
1
2
3
12
2
6
5
3
3
7
2
6
19
对于 100 % 100\% 100% 的数据, 0 ≤ S i ≤ 50 0 \leq S_i \leq 50 0≤Si≤50。
译自 COCI 2014/2015 CONTEST #5。
#include
#include
#include
#include
int dat[20],ans,now;
int main(){
for(int i = 0;i < 8;i++)
{
scanf("%d",&dat[i]);
}
for(int i=0;i<8;i++){
now=0;
for(int j=i,k=0;k<4;j=(j+1)%8,k++)
now+=dat[j];
if(now>ans)ans=now;
}
printf("%d\n",ans);
}
不久以前,在操作系统还未像今天如此发达的时候,计算机无法处理克罗地亚字母表中的某些字母,于是程序员被允许用二到三个计算机能够显示的字符替换这个不能显示的字母,如下表:
不能显示的字母 | 用来替换的字符 |
---|---|
č |
c= |
ć |
c- |
dž |
dz= |
ñ |
d- |
lj |
lj |
nj |
nj |
š |
s= |
ž |
z= |
例如说,ljes=njak
这一个字符串可以用来表示克罗地亚字母表中的六个字母:lj
、e
、š
、nj
、a
、k
。
现在给出一个字符串,请你求出解码后这一个字符串里面包含多少个克罗地亚字母表中的字母。
克罗地亚字母表中的字母除了有上表中的几个字母外,还有英语中的 a
~z
这 26 个字母。
输入仅一行,一个字符串,表示一个按上述方式编码的字符串。
输出仅一行,表示解码之后的字符串包含的克罗地亚字母表中的字母个数。
dz=ak
3
ljes=njak
6
【数据范围】
对于所有数据,满足字符串的长度不超过 100 100 100,且仅包含小写字母和 -
、=
字符。
【题目来源】
本题来源自 COCI 2008-2009 CONTEST 5 T1 LJESNJAK,按照原题数据配置,满分 30 30 30 分。
由 Eason_AC 翻译整理提供。
#include
#include
#include
#include
char str[1001]; //定义字符串
int le = 0, ans = 0; //定义字符串长度与结果
int main()
{
scanf("%s",&str);
le = strlen(str); //求字符串长度
for (int i = 0; i < le; i++) //注意起始为0
{
if (str[i] == 'c' && str[i + 1] == '=')
ans++, i++; //查找特别替换字符,计数,并推i
else if (str[i] == 's' && str[i + 1] == '=')
ans++, i++;
else if (str[i] == 'z' && str[i + 1] == '=')
ans++, i++;
else if (str[i] == 'c' && str[i + 1] == '-')
ans++, i++;
else if (str[i] == 'd' && str[i + 1] == '-')
ans++, i++;
else if (str[i] == 'l' && str[i + 1] == 'j')
ans++, i++;
else if (str[i] == 'n' && str[i + 1] == 'j')
ans++, i++;
else if (str[i] == 'd' && str[i + 1] == 'z' &&str[i + 2] == '=')
ans++, i += 2;
else
ans++; //无需替换,直接计数
}
printf("%d\n",ans);
return 0;
}
伟大的科学发现一般是以科学家的姓氏命名,比如说,最流行的非对称密码系统 RSA 是由三位叫做 Rivest、Shamir 和 Adleman 的科学家发现的,而更为熟知的则是 Knuth-Morris-Pratt 算法,这个算法是由三位叫做 Knuth、Morris 和 Pratt 的科学家命名的。
科学论文会大量引用一些早期的著作,因此在一个论文中出现两种不同的命名约定并不少见。这两种不同的命名约定分别是:
Knuth-Morris-Pratt
。KMP
。现在,你发现了一篇论文中同时使用了长变体和短变体这两种命名约定,这让你感到很不愉快,因此你想编写一个程序,将所有的长变体变为短变体。
输入仅一行,一个字符串,代表在论文中出现的长变体。
每一个长变体中的单词开头一定是大写字母。
输出仅一行,一个字符串,代表长变体经过变换以后的短变体。
Knuth-Morris-Pratt
KMP
Mirko-Slavko
MS
Pasko-Patak
PP
【数据范围】
对于所有数据,满足字符串的长度不超过 100 100 100,且仅包含大小写英文字母和连字符 -
。
【题目来源】
本题来源自 COCI 2009-2010 CONTEST 4 T1 AUTORI,按照原题数据配置,满分 30 30 30 分。
由 Eason_AC 翻译整理提供。
#include
#include
#include
#include
int main()
{
char num[1001];
scanf("%s",&num);
int len = strlen(num);
for(int i = 0;i < len;i++)
{
if(num[i] >= 'A'&&num[i] <= 'Z')
printf("%c",num[i]);
}
return 0;
}
Mirko 和 Slavko 正在拍摄一部改编自科幻小说 Chicks in space 13 的电影。剧本要求他们呈现出不同的世界,所以他们决定在绿屏幕前拍摄整部电影,之后再添加 CGI 背景。Mirko 听说生成人工地形最好的办法是使用中点位移算法。
为了执行这个算法,Mirko 选择了 4 4 4 个点组成了一个完美正方形。然后他开始执行以下步骤:
Mirko 在执行完一次上面的所有操作后拥有了 4 4 4 个新的方块。于是他不断地新建正方形,直到他对结果满意为止。下图说明了算法的初始状态、 1 1 1 次迭代和 2 2 2 次迭代。
Mirko 发现到有些点属于不止一个正方形,为了减少内存消耗,他只存储这些点一次,但是一旦这个点存储进去了,它就会永远储存在内存中。现在他想请你编写一个程序,告诉他经过 n n n 次迭代之后,总共需要在内存中存储多少点。
输入仅一个整数 n n n,表示迭代的次数。
输出仅一个整数,表示 n n n 次迭代后内存内需要存储的点数。
1
9
2
25
5
1089
【数据范围】
对于所有数据, 1 ⩽ n ⩽ 15 1\leqslant n\leqslant 15 1⩽n⩽15。
【题目来源】
本题来源自 COCI 2009-2010 CONTEST 4 T2 PLANINA,按照原题数据配置,满分 50 50 50 分。
由 Eason_AC 翻译整理提供。
#include
#include
#include
#include
int main()
{
int n;
scanf("%d",&n);
n = pow(2,n) + 1;
printf("%d",n*n);
return 0;
}