记录洛谷刷题C语言qaq,都是些不优雅的代码
为了揭开月光能量背后的秘密,你来到了地下的远古档案馆。
远古一族的秘密与遗忘的知识悉数贮藏于这片被尘封的迷宫中,你能成功解谜,获知远古的知识吗?
远古档案馆的中心是一个解谜:
有一个 2 × 2 2\times 2 2×2 的网格,每个格子中要么有一个正整数,要么是空的;
你可以进行若干次操作:每次操作中,你选择一个有正整数的格子和一个与之相邻的空格子,将正整数移到那个空格子中;
给定网格的初始状态和最终状态,保证初始状态和最终状态中包含的正整数个数相同(设为 k k k 个),且它们就是前 k k k 个不同的正整数,问是否可以通过有限次操作从初始状态到达最终状态?
下图展示了一个包含三个正整数的网格经过两次操作的情况:
只有完成解谜,才能获得遗忘的知识,因此你希望尽快解决这个问题。
注意:网格中可能没有正整数,也可能没有空格。
输入共包括四行,每行两个整数。
前两行描述了初始状态,后两行描述了最终状态,用 0 0 0 表示空格子。
如果可以从初始状态到达最终状态,输出 Yes
,否则输出 No
。
2 1
3 0
0 2
3 1
Yes
2 1
4 3
3 4
2 1
No
【样例 1 解释】
如题目描述中图所示。
【样例 2 解释】
没有可移动的正整数,所以无法从初始状态到达与之不相等的最终状态。
【数据范围】
本题采用捆绑测试。
所有数据符合题目描述所述。
#include
#include
#include
#include
int a[5],b[5],num=0,k;
int swap(int a,int b)
{
a = a + b;
b = a - b;
a - a - b;
}
int judge1(){
if(a[1]==b[3]&&a[2]==b[4]){ //a的第一行与b的第二行相同
if(a[1]!=0&&a[2]!=0) return 1;
}
if(a[3]==b[1]&&a[4]==b[2]){ //a的第二行与b的第一行相同
if(a[3]!=0&&a[4]!=0) return 1;
}
if(a[1]==b[2]&&a[3]==b[4]){ //a的第一列与b的第二列相同
if(a[1]!=0&&a[3]!=0) return 1;
}
if(a[2]==b[1]&&a[4]==b[3]){ //a的第二列与b的第一列相同
if(a[2]!=0&&a[4]!=0) return 1;
}
return 0;
}
int judge2(){
if(a[1]==b[1]&&a[2]==b[2]){ //a的第一行与b的第一行相同
if(a[1]==0||a[2]==0) return 1;
}
if(a[3]==b[3]&&a[4]==b[4]){ //a的第二行与b的第二行相同
if(a[3]==0||a[4]==0) return 1;
}
if(a[1]==b[1]&&a[3]==b[3]){ //a的第一列与b的第一列相同
if(a[1]==0||a[3]==0) return 1;
}
if(a[2]==b[2]&&a[4]==b[4]){ //a的第二列与b的第二列相同
if(a[2]==0||a[4]==0) return 1;
}
return 0;
}
int judge3(){
if(a[1]==b[1]&&a[4]==b[4]|| //a,b左上与右下相同
a[2]==b[2]&&a[3]==b[3]){ //a,b右上与左下相同
return 1;
}
return 0;
}
int same(){ //a,b四个格完全相同
if(a[1]==b[1]&&a[2]==b[2]&&a[3]==b[3]&&a[4]==b[4]) return 1;
return 0;
}
int move(int x){
swap(a[k],a[x]); //x格中数字移到空格位置
if((judge1()||judge2()||judge3())&&!same()) return 1;
else swap(a[k],a[x]); //判断不成立,数字回到x格
return 0;
}
int main(){
scanf("%d %d %d %d",&a[1],&a[2],&a[3],&a[4]);
scanf("%d %d %d %d",&b[1],&b[2],&b[3],&b[4]);
for(int i=1;i<=4;i++){
if(a[i]==0){
num++; //记录空格个数
k=i; //记录空格出现位置
}
}
if(same()){ //四个格全部相同
printf("Yes");
return 0;
}
if(num==0){ //四个格全部不为空
printf("No");
return 0;
}
if(num>=2){ //空格个数两个及以上
printf("Yes");
return 0;
}
//以下均为只存在一个空格的情况
if(judge1()||judge2()||judge3()){ //判断
printf("No");
return 0;
}
if(k==2||k==3){ //空格位置为2或3时
if(move(1)||move(4)){ //判断1,4格中数字移到空格位置时
printf("No");
return 0;
}
}
if(k==1||k==4){ //空格位置为1或4时
if(move(2)||move(3)){ //判断2,3格中数字移到空格位置时
printf("No");
return 0;
}
}
printf("Yes"); //全部不成立,结束
return 0;
}
本游戏改编自克罗地亚电视节目《我爱克罗地亚》中的游戏 I l o v e m y c o u n t r y \tt{I\ love\ my\ country} I love my country。
有 8 8 8 个人坐成一圈,如图所示。
他们中的某一个人会拿着一个箱子,这个箱子会在比赛开始后 210 210 210 秒爆炸。
主持人会问拿箱人问题,拿箱人可以选择以下方式:
现在你知道对于每个问题,回答该问题的人所用的时间与回答情况。
给定游戏开始时拿箱人的编号与问题的数量,求出箱子爆炸时拿箱人的编号。
箱子传递时间与两个问题之间的时间忽略不计,数据保证箱子爆炸时箱子在某个人手上,且问题没有问完。
第一行一个整数 K K K,表示游戏开始时拿箱人的编号。
第二行一个整数 N N N,表示问题的数量。
接下来 N N N 行,每行有一个整数 T T T 与一个字符,表示回答该问题的人所用的时间与回答情况:
仅一行一个整数,即箱子爆炸时拿箱人的编号。
1
5
20 T
50 T
80 T
50 T
30 T
5
3
5
100 T
100 N
100 T
100 T
100 N
4
5
6
70 T
50 P
30 N
50 T
30 P
80 T
7
对于 100 % 100\% 100% 的数据,有 1 ≤ K ≤ 8 1\le K\le 8 1≤K≤8, 1 ≤ N , T ≤ 100 1\le N,T\le 100 1≤N,T≤100。
本题译自 COCI2013-2014 CONTEST 2 T1 VOLIM。
按照原题数据配置,本题满分 50 50 50 分。
#include
#include
#include
#include
int main()
{
int k, n;
scanf("%d%d",&k,&n);
int t;
for (int i = 1; i <= n; i++)
{
int x;
char c;
scanf("%d %c",&x,&c);
t += x;
if (t >= 210)
{
printf("%d",k);
return 0;
}
else
{
if (c == 'T')
{
if (k == 8)
{
k = 1;
}
else
{
k++;
}
}
}
}
return 0;
}
Mirko 已经成为一个铁杆爱国者,所以他要求你给他画一个克罗地亚棋盘。
棋盘由红色格子和白色格子组成。棋盘左上角的格子是红色。其余的格子在棋盘中交替显示成白色和红色。我们在本题中用 X
表示红色区域,用 .
表示白色区域。Mirko 的棋盘应该由
r
×
c
r\times c
r×c 的格子组成,并且每个格子是由字符 X
和 .
组成的
a
×
b
a\times b
a×b 的字符矩阵。请你帮助他画出这个棋盘。
输入共两行。
第一行两个整数
r
,
c
r,c
r,c,分别表示棋盘的行数和列数。
第二行两个整数
a
,
b
a,b
a,b,分别表示每个格子中的字符矩阵行数和列数。
输出共 r × a r\times a r×a 行,每行 c × b c\times b c×b 个字符,描述最终画出来的棋盘。
2 4
2 2
XX..XX..
XX..XX..
..XX..XX
..XX..XX
5 5
2 3
XXX...XXX...XXX
XXX...XXX...XXX
...XXX...XXX...
...XXX...XXX...
XXX...XXX...XXX
XXX...XXX...XXX
...XXX...XXX...
...XXX...XXX...
XXX...XXX...XXX
XXX...XXX...XXX
【数据范围】
对于所有数据, 1 ⩽ r , c , a , b ⩽ 10 1\leqslant r,c,a,b\leqslant 10 1⩽r,c,a,b⩽10。
【题目来源】
本题来源自 COCI 2012-2013 CONTEST 3 T1 SAHOVNICA,按照原题数据配置,满分 50 50 50 分。
由 Eason_AC 翻译整理提供。
#include
#include
#include
#include
int main()
{
int r, c, a, b;
scanf("%d%d",&r,&c);
scanf("%d%d",&a,&b);
for(int i = 1;i <= r;i++)
{
for(int y = 0;y < a;y++)
{
for(int j = 1;j <= c;j++)
{
if((i+j)%2 == 0)
{
for(int x = 0;x < b;x++)
{
printf("X");
}
}
else
for(int x = 0;x < b;x++)
{
printf(".");
}
}
printf("\n");
}
}
return 0;
}
渔夫在昨晚捕到 N N N 条金枪鱼。他准备将这些鱼卖给一个平台。
对于每一条鱼,平台会给出两个估测值 P 1 , P 2 P_1,P_2 P1,P2。如果这两个值之差不超过 X X X,则取较大的值作为该条鱼的价值;否则如果差超过 X X X,则取另一个值 P 3 P_3 P3。
现在给定 N N N 条鱼的值(可能会有 2 2 2 个或 3 3 3 个),求所有鱼的总价值。
第一行,一个整数 N N N,表示金枪鱼的数量。
第二行,一个整数 X X X。
接下来的若干行分为 N N N 个部分用来表示每条鱼的信息。每部分的格式为下列二者之一:
输出所有鱼的总价值。
5
2
3 4
2 1
5 3
4 4
4 2
19
4
2
3 5
2 8
4
6 5
6 3
7
22
3
10
20 50
30
20 40
50
70 20
10
90
【样例 2 解释】
渔夫捕到了 4 4 4 条金枪鱼,而 X X X 的值为 2 2 2:
金枪鱼编号 | p 1 p_1 p1 | p 2 p_2 p2 | p 3 p_3 p3 | 差值 | 最终价值 |
---|---|---|---|---|---|
1 1 1 | 3 3 3 | 5 5 5 | / | 2 ≤ 2 2 \le 2 2≤2 | 5 5 5 |
2 2 2 | 2 2 2 | 8 8 8 | 4 4 4 | 6 > 2 6 \gt 2 6>2 | 4 4 4 |
3 3 3 | 6 6 6 | 5 5 5 | / | 1 ≤ 2 1 \le 2 1≤2 | 6 6 6 |
4 4 4 | 6 6 6 | 3 3 3 | 7 7 7 | 3 ≤ 7 3 \le 7 3≤7 | 7 7 7 |
故价值总和为 5 + 4 + 6 + 7 = 22 5+4+6+7=22 5+4+6+7=22。
【数据规模与约定】
对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 20 1 \le N \le 20 1≤N≤20, 1 ≤ X ≤ 10 1 \le X \le 10 1≤X≤10, 1 ≤ P 1 , P 2 , P 3 ≤ 100 1 \le P_1,P_2,P_3 \le 100 1≤P1,P2,P3≤100。
【提示与说明】
题目译自 COCI 2016-2017 CONTEST #5 T1 Tuna。
本题分值按 COCI 原题设置,满分 50 50 50。
#include
#include
#include
#include
int main()
{
int n;
scanf("%d",&n);
int x;
scanf("%d",&x);
long long sum = 0;
for(int i = 0;i < n;i++)
{
int a, b;
scanf("%d%d",&a,&b);
if(abs(a - b) > x)
{
int c;
scanf("%d",&c);
sum = sum + c;
}
else
{
if(a > b)
sum = sum + a;
else if(b >= a)
sum = sum + b;
}
}
printf("%ld\n",sum);
return 0;
}
有两个单词 A , B A,B A,B,将 A A A 水平摆放, B B B 竖直摆放,两个单词重叠部分必须为同一字母,且这一字母须在 A , B A,B A,B 中第一次出现。
例如,当 A="ABBA",B="CCBB"
时,输出如下所示:
.C..
.C..
ABBA
.B..
一行,两个字符串,由大写字母组成,分别表示 A A A 和 B B B。
一个矩阵,表示摆放结果。
其中无字符用 .
表示。
BANANA PIDZAMA
.P....
.I....
.D....
.Z....
BANANA
.M....
.A....
MAMA TATA
.T..
MAMA
.T..
.A..
REPUBLIKA HRVATSKA
H........
REPUBLIKA
V........
A........
T........
S........
K........
A........
数据保证有解。
字符串由大写字母构成。
题目译自 COCI 2011/2012 #5 T1。
#include
#include
#include
#include
int main()
{
char a[1001], b[1001];
scanf("%s %s",&a,&b);
int lena = strlen(a);
int lenb = strlen(b);
int n = 0, m = 0;
for(n = 0;n < lena;n++)
{
for(m = 0;m < lenb;m++)
{
if(a[n] == b[m])
break;
}
if(a[n] == b[m])
break;
}
// printf("%d %d\n",n,m);
for(int i = 0;i < lenb;i++)
{
for(int j = 0;j < lena;j++)
{
if(j == n)
{
printf("%c",b[i]);
}
else if(i == m)
{
printf("%c",a[j]);
}
else
printf(".");
}
printf("\n");
}
return 0;
}