2018年程序设计基础(B)I题解
珂朵莉篇
今年是哪年?
威廉是人类世界的准勇者,在完成任务时被石化,直至数百年后年才被发现,治疗并脱离石化状态。
作为刚刚脱离石化的威廉,他十分想知道今年是哪一年。
如果得知今年的年分大于等于2018年,威廉会十分惊讶并惊呼 “What?” 。否则输出 “I know”(不包含引号)。
Input
输入一个数字n,代表威廉苏醒时的年份。( 1000 <= n <= 9999 )
Output
若 n 大于等于2018,输出 “What?
” ,否则输出 “I know
” 。(均不包含括号)
Sample Input
2018
Sample Output
What?
答案:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
if(n>=2018)
{
printf("What?\n");
}
else
printf("I know\n");
return 0;
}
珂朵莉与黄油面包
珂朵莉非常喜欢吃黄油面包,现在珂朵莉想吃一个大小为 d 的黄油面包,你能满足她么?
Input
一个正整数 d 。(1<= d <=20)
Output
一个高和宽均为 2*d-1 的菱形,代表一个大小为 d 的黄油面包,详见样例。
Sample Input
3
Sample Output
*
* *
* *
* *
*
答案:
#include<stdio.h>
int main()
{
int d,i,j;
scanf("%d",&d);
for(i=1;i<=d;i++)
{
for(j=1;j<=d-i;j++)
{
printf(" ");
}
printf("*");
if(i==1)
{
printf("\n");
}
if(i>=2)
{
for(j=1;j<=2*(i-1)-1;j++)
{
printf(" ");
}
printf("*\n");
}
}
for(i=1;i<=d-1;i++)
{
for(j=1;j<=i;j++)
{
printf(" ");
}
if(d-1-i==0)
printf("*\n");
else
{
printf("*");
for(j=1;j<=2*(d-1-i)-1;j++)
{
printf(" ");
}
printf("*\n");
}
}
return 0;
}
珂朵莉与圣剑保养
圣剑是由若干护符经过精密的联系组合成的,在进行圣剑的保养时由于护符间复杂的相互干涉作用会发出美妙的音符声,威廉作为人类勇者精通圣剑保养,经过多年总结发现最终发出的音符与保养时拨动的护符编号 m 及拨动的力度 n 存在一定的函数关系F(m, n) 。
珂朵莉用大小为 n 的力度拨动了 一下编号为 m 的护符,你知道经过复杂的相互干涉作用最终发出的音符是什么么?
F(m, n)的定义是:
- 若 m * n <= 7,返回 m * n 。
- 否则若 m >= 0且 n >= 0,返回F( m - 2 , F ( m - 1 , n - 1 ) ) 。
- 否则若 m < 0 或 n < 0 , 返回 1 。
Input
多组输入至文件结束,每行两个正整数 m,n。( 0<= m, n<= 100 )
Output
每组数据输出一行包含一个正整数代表最终发出的音符。
Sample Input
23 33
Sample Output
0
答案:
#include<stdio.h>
int F(int m,int n)
{
if(m*n<=7)
{
return m*n;
}
if(m>=0&&n>=0)
{
return F(m-2,F(m-1,n-1));
}
if(m<0||n<0)
{
return 1;
}
}
int main()
{
int m,n;
while(~scanf("%d %d",&m,&n))
printf("%d\n",F(m,n));
return 0;
}
珂朵莉与失忆
珂朵莉由于受到前世记忆的侵蚀会不断地失忆。但是并不是每天都会失忆。
失忆的发生条件是当且仅当这一天的编号为素数的时候,会失去这一天编号的数位之和个单位的记忆。
现在珂朵莉想知道在编号为 l 到 r 的这段日子里一共会失去多少记忆?
Input
多组输入至文件结束为止,每组两个数 l , r 含义如上文所述。到文件结束为止(1 <= l <= r <= 100)
Output
输出一个整数代表失去的记忆总数。
Sample Input
10 15
Sample Output
6
答案:
#include<stdio.h>
#include<math.h>
int main()
{
int i,sum,n,m,j,flag,c,x;
while(~scanf("%d %d",&n,&m))
{
sum=0;
for(i=n; i<=m; i++)
{
x=i;
flag=0;
c=0;
if(i==1)
sum-=1;
if(x==2)
{
while(x)
{
c+=x%10;
x/=10;
}
sum+=c;
}
else
{
x=i;
for(j=2; j<=sqrt(x); j++)
{
if(x%j==0)
{
flag=1;
break;
}
}
if(flag==0)
{
while(x)
{
c+=x%10;
x/=10;
}
sum+=c;
}
}
}
printf("%d\n",sum);
}
return 0;
}
珂朵莉与圣剑
妖精仓库里有n把圣剑,每把圣剑都有一个攻击值 d 和对使用者体力的消耗值 s 。
珂朵莉想要攻击值高的圣剑,同时又想要体力的消耗尽可能地低,因此对她来说,圣剑的满意度等于攻击值 d 除以消耗值 s 。
现在珂朵莉想要知道她第 k 满意的圣剑的满意度是多少(满意度越高越好)。
Input
第一行两个正整数 n 和 k ,n 代表圣剑的数量。(1 <= k <= n <= 1000)
接下来 n 行每行两个正整数 di 和 si ,分别代表第 i 把圣剑的攻击值和对使用者体力的消耗值。(1 <= si , di <=100)
Output
一个正整数代表她第 k 满意的圣剑的满意度是多少,结果保留两位小数。
Sample Input
4 2
1 3
2 4
3 6
4 5
Sample Output
0.50
答案:
#include<stdio.h>
int main()
{
int n,k,i;
double a[10000],d,s,t;
scanf("%d %d",&n,&k);
for(i=1;i<=n;i++)
{
scanf("%lf %lf",&d,&s);
a[i]=d/s;
}
for(i=1;i<n;i++)
{
for(int j=1;j<=n-i;j++)
{
if(a[j]<a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
printf("%.2lf\n",a[k]);
return 0;
}
珂朵莉与妖精仓库的妖精们
随着失忆的加剧,珂朵莉已经不能记清妖精仓库里小妖精们的名字了。
好在珂朵莉一直有写日记的好习惯,一天,在她读日记的时候,想要知道在自己的日记中对于每个小妖精分别提到过多少次她们的名字。你能告诉她么?
妖精仓库中的小妖精的名字分别为 Nephren
Ithea
Rhantolk
Nopht
Input
一长度行不超过1000的字符串代表日记的内容,输入数据保证不含空格。
Output
输出包含四行,
每行按照样例顺序输出名字及其在日记中被提到的次数。
输出格式请仔细按照示例输出的格式输出。
Sample Input
fdsgfsgfdNephrensNephrenItheagdfRhantolkRhantolkdsdNophtNopht
Sample Output
Nephren: 2
Ithea: 1
Rhantolk: 2
Nopht: 2
答案:
#include <stdio.h>
#include <math.h>
#include <string.h>
int a[5], len;
char s[1111];
int main()
{
scanf("%s", s);
len = strlen(s);
int i;
for (i = 0; i < len; i++)
{
if (s[i] == 'N' && s[i + 1] == 'e' && s[i + 2] == 'p' && s[i + 3] == 'h' && s[i + 4] == 'r' && s[i + 5] == 'e' && s[i + 6] == 'n')
a[0]++;
if (s[i] == 'I' && s[i + 1] == 't' && s[i + 2] == 'h' && s[i + 3] == 'e' && s[i + 4] == 'a')
a[1]++;
if (s[i] == 'R' && s[i + 1] == 'h' && s[i + 2] == 'a' && s[i + 3] == 'n' && s[i + 4] == 't' && s[i + 5] == 'o' && s[i + 6] == 'l' && s[i + 7] == 'k')
a[2]++;
if (s[i] == 'N' && s[i + 1] == 'o' && s[i + 2] == 'p' && s[i + 3] == 'h' && s[i + 4] == 't')
a[3]++;
}
printf("Nephren: %d\n", a[0]);
printf("Ithea: %d\n", a[1]);
printf("Rhantolk: %d\n", a[2]);
printf("Nopht: %d\n", a[3]);
return 0;
}
珂朵莉与斯卡布罗集市
斯卡布罗集市是一个非常繁华的集市,这里有很多有名的景点。为了防止迷路,威廉买了一张集市的地图,地图长 m 宽 n ,其中 “1” 代表他们目前的位置,“0” 代表空地,其他数字分别代表不同的景点(每个景点的编号均不同且每个景点在地图上只出现一次)。
现在珂朵莉想要知道从当前位置到距离编号为 x 的景点在地图上的最短距离是多少(在地图上只能沿与坐标平行的方向移动,图中的每一个点都可以走),你能帮帮他么?
Input
多组输入,每组数据第一行两个数字 n , m 代表地图的宽和长( 1<= n, m<= 100) 。
接下来的 n 行每行 m 个数(空格分隔)代表地图。
最后输入一个数字 x 代表珂朵莉想要去的景点编号( 2<= x<= 1000)。
Output
输出当前位置距离想去的景点在地图上的最短距离(在地图上只能沿与坐标平行的方向移动)
Sample Input
3 3
0 1 2
3 0 0
6 4 9
6
Sample Output
3
Hint
在计算地图上的最短距离时结果仅与两点坐标有关而不会因为其他景点的阻隔而绕路,对于样例:
( 1, 2 ) -> ( 2, 2 )
( 2, 2 ) -> ( 3, 2 )
( 3, 2 ) -> ( 3, 1 )
因此答案是 2 + 1 ,三步。
答案:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,m,i,j,xx,x,y;
int a[101][101];
while(~scanf("%d %d",&n,&m))
{
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]==1)
{
x=i;
y=j;
}
}
}
scanf("%d",&xx);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a[i][j]==xx)
{
printf("%d\n",abs(x-i)+abs(y-j));
}
}
}
}
return 0;
}
最终之战
恭喜大家来到最终之战。这对珂朵莉一行来说是非常重要的一战,同时也极有可能是决定你能否在本次期末考试中成功AK,收获满分的一战,祝大家战斗胜利。
为了简化战斗过程,尽可能的用最小的损失来赢得战斗,我们制定了如下的战斗规则:
战斗开始后,我方会按照输入的顺序依次派出血量大于 0 的妖精循环攻击兽( 最后一人攻击完后再从第一个人开始依次攻击),每次攻击时所实际输出的攻击力为妖精的攻击力与所持圣剑之和,由于兽具有防御,兽实际收到的伤害为所受攻击的攻击力减去自身的防御力。攻击时优先攻击体型较大的兽。攻击结束后我方妖精同样会受到所攻击兽的攻击,受到的伤害同样为兽的攻击力减掉我方妖精的防御力。同时由于速度的不同,若我的速度大于所攻击兽的速度,我可以额外攻击一次相同的兽,若我的速度小于所攻击兽的速度 ,则兽可以多攻击我一次。
注意,若被攻击后血量小于等于0,则认为他已经牺牲了,将不会再参与之后回合的战斗,但当前回合不受影响,例如在某一回合中,兽受到攻击后血量降低至0一下,但它依然可以在本回合中发起反击。
下面是兽的数据:
中文名 英文名(id) 血 攻 防 速 体型
叹月的最初之兽 Chantre 2333 100 7 input 9
深潜的第六兽 Timere 600 34 4 input 8
穿凿的第二兽 Aurora 200 24 3 input 7
绞吞的第四兽 tarde 400 43 9 input 6
广覆的第五兽 Materno 500 34 3 input 5
沉滞的第十一兽 Croyance 1100 65 6 input 4
织光的第十四兽 Vinkra 1400 90 2 input 3
下面是圣剑的数据:
中文名 英文名(id) 加成
珀西瓦尔 Perseval 78
瑟尼欧里斯 Ceniolis 43
瓦尔卡利斯 Valgaris 110
印萨尼亚 Insania 23
现在请你根据输入的数据判断能否在100回合内获胜,若可以获胜,输出攻击的最少回合数,否则输出“BOOM!
”。
Input
首先输入四行,每行由五部分组成,分别是要派出的妖精的名字,血量,攻击值,防御值,速度和所拿的武器名。
最后一行包含七个空格分隔的数字,代表按体型由大到小的兽的速度。
妖精和武器的名字是一个长度不超过10的不含空格的字符串,1<=血量<=2000,10<=攻击值<=100,1<=防御值<=100,1<=速度<=10。
Output
若可以获胜(所有兽的血量均小于等于0),输出攻击的最少回合数,否则输出“BOOM!”。
Sample Input
Willem 2000 100 100 10 Valgaris
Chtholly 1500 70 40 9 Perseval
Nephren 1000 56 45 6 Insania
Ithea 500 65 54 5 Ceniolis
9 4 3 5 3 2 6
Sample Output
33
Hint
我方每派出一名妖精战斗即视为回合数加一。
实际所受攻击可能小于零,例如,当所受攻击力为5,自身防御力为10的时候,实际所受攻击为5-10=-5,这时无需特殊判断,可以理解为当攻击过小时,被攻击一方可化攻击为血量,血量上升。
答案:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int main()
{
int axue[11],agong[11],afang[11],asu[11];
int bxue[11],bgong[11],bfang[11],bsu[11];
char c[11];
for(int i=0; i<4; i++)
{
scanf("%s %d %d %d %d %s",c,&axue[i],&agong[i],&afang[i],&asu[i],c);
if(strcmp(c,"Perseval")==0)
agong[i]+=78;
if(strcmp(c,"Ceniolis")==0)
agong[i]+=43;
if(strcmp(c,"Valgaris")==0)
agong[i]+=110;
if(strcmp(c,"Insania")==0)
agong[i]+=23;
}
bxue[0]=2333;
bgong[0]=100;
bfang[0]=7;
bxue[1]=600;
bgong[1]=34;
bfang[1]=4;
bxue[2]=200;
bgong[2]=24;
bfang[2]=3;
bxue[3]=400;
bgong[3]=43;
bfang[3]=9;
bxue[4]=500;
bgong[4]=34;
bfang[4]=3;
bxue[5]=1100;
bgong[5]=65;
bfang[5]=6;
bxue[6]=1400;
bgong[6]=90;
bfang[6]=2;
for(int i=0; i<7; i++)
{
scanf("%d",&bsu[i]);
}
int i=-1,ans=0,dd=100;
while(dd--)
{
i++;
i%=4;
if(axue[i]<=0)
{
continue;
}
for(int j=0; j<7; j++)
{
if(bxue[j]>0)
{
ans++;
bxue[j]-=agong[i]-bfang[j];
axue[i]-=bgong[j]-afang[i];
if(asu[i]>bsu[j])
{
bxue[j]-=agong[i]-bfang[j];
}
else if(asu[i]<bsu[j])
{
axue[i]-=bgong[j]-afang[i];
}
break;
}
}
}
int f=1;
for(int j=0; j<7; j++)
{
if(bxue[j]>0)
{
f=0;
}
}
if(f)
printf("%d\n",ans);
else
printf("BOOM!\n");
return 0;
}
御坂美琴篇
御坂美琴与妹妹们
在[量产型能力者计划]和[绝对能力者进化计划]中,学院都市利用御坂美琴的体细胞总共制作了20001个克隆个体。她们的个体编号分别为00001-20001。其中[00001,20000]号被称为"SISTER"(御坂妹妹) ,20001号被称为 “LastOrder”(最后之作)。
现在给你一个御坂的个体编号,请你判断她是"SISTER
" 还是"LastOrder
".
Input
输入一个正整数 id 表示御坂的个体编号 ( 1 <= id <= 20001 )。
输入数据没有前导零。
Output
根据题意输出"SISTER" 或是 “LastOrder”。 (引号不输出)
Sample Input
10086
Sample Output
SISTER
答案:
#include<stdio.h>
#include<string.h>
int main()
{
int id;
scanf("%d",&id);
if(id>=00001&&id<=20000)
{
printf("SISTER\n");
}
else if(id==20001)
{
printf("LastOrder\n");
}
return 0;
}
御坂美琴与初春饰利
「初春饰利」 是御坂美琴的好朋友,在风纪委员中负责通信与情报管理工作。她很擅长密码破译等骇客工作,曾击败许多网络黑客入侵“某个系统”的挑战,是超天才的黑客,也是都市传说中“守护神(Gatekeeper)”的正体,但她本人并不知晓。
但是某一天,御坂美琴给了初春一个密码。初春发现这个密码实在是太复杂了,完全找不出任何的设计规律。经过认真分析后,初春发现密码中包含且仅包含大写字母和数字,她决定先把这些大写字母和数字分离开再继续寻找规律。
Input
输入数据共两行。
第一行输入一个正整数 len 表示字符串的长度。 (2 <= len <= 100)
第二行输入一个长度为 len 包含且仅包含大写字母和数字的字符串。
Output
第一行输出字符串中出现的大写字母。
第二行输出字符串中出现的数字。
(按在原串中出现的顺序输出,已经输出过的字符若再次出现仍需要输出)
Sample Input
18
ZXC741ASD852QWE963
Sample Output
ZXCASDQWE
741852963
答案:
法一:
#include<stdio.h>
#include<string.h>
int main()
{
int len,i,j=0,k=0,x,y;
char a[100],b[100],c[100];
scanf("%d",&len);
scanf("%s",a);
for(i=0; i<len; i++)
{
if(a[i]>='A'&&a[i]<='Z')
{
b[j]=a[i];
j++;
}
x=j;
if(a[i]>='0'&&a[i]<='9')
{
c[k]=a[i];
k++;
}
y=k;
}
for(j=0; j<x; j++)
{
printf("%c",b[j]);
}
printf("\n");
for(k=0; k<y; k++)
{
printf("%c",c[k]);
}
printf("\n");
return 0;
}
法二:
#include<stdio.h>
#include<string.h>
int main()
{
int len,i;
char s[100];
scanf("%d",&len);
scanf("%s",s);
for(i=0; i<len; i++)
{
if(s[i]>='A'&&s[i]<='Z')
printf("%c",s[i]);
}
printf("\n");
for(i=0; i<len; i++)
{
if(s[i]>='0'&&s[i]<='9')
printf("%c",s[i]);
}
printf("\n");
return 0;
}
御坂美琴与佐天泪子
「佐天泪子」是超过level 5级别的强者(误),人称「泪爷」。泪爷的衣服各式各样,这种超能力被誉为「海澜之家」。
一天,泪爷准备和御坂美琴、初春饰利一起出去吃饭,她打开了自己的衣柜(启动「海澜之家」),想要挑选一件合适的衣服出门。
衣柜里总共有 N 件衣服依次排列,第 i 件衣服的编号为 i。
第 i 件衣服有它的美观值 ai 和当前的穿戴次数 bi,每件衣服的优先值为 ai / (bi+1) ,向下取整 。不过泪爷和[初春饰利]关系非常好,初春喜欢编号为素数的衣服,所以如果某件衣服的编号为素数,那么泪爷会把这件衣服的优先值翻倍,泪爷想知道这 N 件衣服的优先值分别是多少。
Input
第一行输入一个正整数 N。(1<= N <=100)
接下来N行,每行输入两个正整数 ai,bi 。(0 <= ai , bi<= 100)
Output
输出一行,包括 N 个整数,第 i 个整数表示第 i 件衣服的优先值。
Sample Input
5
8 2
1 1
4 3
10 0
5 1
Sample Output
2 0 2 10 4
答案:
#include<stdio.h>
#include<math.h>
int main()
{
int N,i,a[100],b[100],x[100],flag;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
scanf("%d %d",&a[i],&b[i]);
x[i]=a[i]/(b[i]+1);
}
for(i=1;i<=N;i++)
{
flag=0;
if(i==1)
printf("%d",x[i]);
if(i==2)
printf(" %d",2*x[i]);
if(i>2)
{
for(int j=2;j<=sqrt(i);j++)
{
if(i%j==0)
{
flag=1;
break;
}
}
if(flag==0)
x[i]*=2;
printf(" %d",x[i]);
}
}
printf("\n");
return 0;
}
御坂美琴与白井黑子
「白井黑子」 是御坂美琴的舍友,同时也是御坂美琴的超级迷妹,平时称呼美琴为"姐姐大人"。为了庆祝和美琴同寝一个月,白井黑子订购了一些“ 电脑配件 ”。但是御坂美琴接了送货员电话,在一番追问后事情败露。
白井黑子决定下次买“电脑配件”的时候,要和送货员商量好接头暗号,接头暗号是一个函数。
白井黑子定义了一个函数 F(x, y) :
- 当 y 不等于0时,返回 F(x, y-1)+F(x-1, y-1)。
- 当 y 等于0时,返回 x+1。
- 黑子要求送货员说一个 x, y ,然后自己回答 F(x, y) 。
Input
一行两个整数分别表示x, y。 (0<=x,y<=15)
Output
一个整数表示F(x, y)
Sample Input
3 5
Sample Output
48
答案:
#include<stdio.h>
int F(int x,int y)
{
if(y!=0)
{
return F(x,y-1)+F(x-1,y-1);
}
if(y==0)
{
return x+1;
}
}
int main()
{
int x,y;
scanf("%d %d",&x,&y);
printf("%d\n",F(x,y));
return 0;
}
真正的落雷
「御坂美琴」在学园都市中仅有的七名超能力者(Level 5)中排名第三。最常用的招式是「超电磁炮(Railgun)」,但是她最后的绝招是[真正的落雷]。
一天,御坂美琴来到一片nm的空地上测试落雷的威力,首会她会选择释放的威力K ,然后选择释放的中心坐标(x,y) 。 所有距离中心坐标(x,y)距离小于等于 K 的空地全部被烧焦。烧焦的空地用 '’ 表示,未烧焦的空地用 ‘.’ 表示,请你输出落雷后空地的状态。御坂美琴觉得这十分简单,所以请你千万不要想得太复杂。
御坂美琴能够控制好自己的能力,所以落雷的攻击范围保证不会超出空地。
Input
输入五个整数n , m, x , y , K 分别表示空地的大小、落雷的释放中心坐标和落雷的威力。
(1 <= n,m,x,y <= 300, 0 <= k <= 300)
Output
n 行 m 列的字符矩阵。
Sample Input
10 10 5 4 3
Sample Output
..........
...*......
..***.....
.*****....
*******...
.*****....
..***.....
...*......
..........
..........
Hint
两点间的距离:两点的横坐标之差+两点的纵坐标之差。
例如(3,5)与(7,8) 之间的距离为:|3-7|+|5-8| = 7
答案:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n,m,x,y,k;
scanf("%d%d%d%d%d",&n,&m,&x,&y,&k);
int i,j;
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
if(abs(x-i)+abs(y-j)<=k)
printf("*");
else
printf(".");
printf("\n");
}
return 0;
}
御坂美琴与呱太
御坂美琴最喜欢「呱太」了,尽管她自己从来不承认。
一天御坂美琴在隔壁商店发现了新上架的呱太,作为[常盘台中学]的大小姐,她有足够多的钱把所有的呱太全部买下来。但是她现在只带了 X 元钱,美琴决定先买尽量多的呱太,如果还有剩余的呱太,那么她就再回去拿钱买剩余的呱太。她想知道现在最多能先买下多少呱太。
商店里共有 N 个呱太,第 i 个的价格为 vi 元。
Input
第一行输入一个正整数N,X(1<=N<=100 , 1 <= X <= 1000000)
第二行输入 N 个正整数,第 i 个正整数表示第 i 个呱太的价格 vi。(1 <= vi <= 9000)
Output
一个正整数,表示现在最多能先买下多少个呱太。
Sample Input
5 10
7 2 5 3 1
Sample Output
3
答案:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int s[110];
int main()
{
int i,j,n,x,ans=0;
scanf("%d%d",&n,&x);
for(i = 1; i <= n; i++)
scanf("%d",&s[i]);
for(i = 1; i < n; i++)
for(j = 1; j < n; j++)
if(s[j]>s[j+1])
{
s[j] = s[j]+s[j+1];
s[j+1] = s[j]-s[j+1];
s[j] = s[j]-s[j+1];
}
for(i = 1; i <= n; i++)
{
if(x-s[i]>0)
{
x -= s[i];
ans++;
}
else
break;
}
printf("%d",ans);
return 0;
}
御坂美琴与伙伴们
一天御坂美琴、白井黑子、初春饰利、佐天泪子四个人在一起玩游戏,游戏规则是给一个 N*M 的方格矩阵,矩阵中有一些数字,四个人依次取数字,每次可以取走一个小方格内的数字,每个方格最多被取一次。当所有数字被取完时游戏结束,每个人的最终得分是其所取的数字之和。
每个人都想要使自己的得分尽可能多,那么你知道游戏结束后她们每个人的得分分别是多少吗?
Input
第一行输入两个正整数N,M(1<=N, M<=10)。
接下来输入一个N行M列的数字矩阵, 小格子内数字的取值范围为[1,1000]。
Output
输出一行包括4个整数,分别表示御坂美琴、白井黑子、初春饰利、佐天泪子的得分。
Sample Input
2 3
2 2 3
4 4 1
Sample Output
6 5 3 2
答案:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int s[200],num[4];
int main()
{
int n,m,i,j;
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
scanf("%d",&s[(i-1)*m+j]);
for(i = 1; i < n*m; i++)
for(j = 1; j < n*m; j++)
if(s[j]<s[j+1])
{
s[j] = s[j]+s[j+1];
s[j+1] = s[j]-s[j+1];
s[j] = s[j]-s[j+1];
}
for(i = 1; i <= n*m; i ++)
num[i%4]+=s[i];
for(i = 1; i <= 4; i ++)
{
printf("%d",num[i%4]);
if(i!=4)
printf(" ");
}
return 0;
}
一方通行与最后之作
学园都市仅有的七名超能力者(Level 5)排名第一位,能力为“矢量操作”,代号「一方通行(Accelerator)」。
某天,「最后之作」自己去商场玩耍,很晚还没有回来。「一方通行」很担心于是决定去找最后之作。
商场可以大体看作一个 NM 的矩形,墙壁和遮挡物用 '’ 表示,空白位置用 ‘.’ 表示,一方通行和最后之作的起始位置分别用 ‘A’ 和 ‘L’ 表示。(显然,他们两个人的起始位置是不可能有遮挡物的)
两人总共最多进行 K 次移动,每次移动可以用两个字符串 name 和 direction 来表示。
如果 name 为"Accelerator",表示本次是「一方通行」移动。
如果 name 为"LastOrder",表示本次是「最后之作」移动。
direction 可能为"up"或"down"或"left"或"right",分别表示向上、向下、向左、向右移动一个单位长度。
如果本次要移动的位置在商场外或者存在遮挡物,那么将不移动。如果两人中途已经相遇(坐标重合),那么之后的所有移动全部取消。
数据保证「一方通行」和「最后之作」会相遇,如果最后是「一方通行」走向「最后之作」请输出"Accelerator",如果是「最后之作」走向「一方通行」请输出"MisakaMisaka"。然后输出两人实际总共移动了多少步。
Input
首先输入两个正整数 N, M表示商场的大小。(2 <= N, M <= 100)
然后输入一个 N 行 M 列的字符矩阵。
下一行输入一个正整数 K,表示两人总共最多进行 K 次移动。 ( 1 <= K <= 100)
接下来 K 行,每行包括两个字符串,分别表示移动的角色和移动的方向。
Output
第一行输出一个字符串。
第二行输出一个正整数,表示两人实际总共移动了多少步相遇。
Sample Input
4 5
A.*..
..*..
..*..
....L
11
Accelerator down
LastOrder left
LastOrder right
LastOrder left
LastOrder left
Accelerator down
Accelerator down
Accelerator down
LastOrder up
LastOrder left
LastOrder left
Sample Output
MisakaMisaka
9
Hint
样例中,两人最终在第四行第一列相遇,最后一次移动是「最后之作」走向「一方通行」。
「一方通行」移动了3步,「最后之作」移动了6步,两人总共移动了9步。
答案:
#include<bits/stdc++.h>
using namespace std;
char s1[110];
char s2[110];
int main()
{
int n,m,i,j,k,l=0;
int x1,y1,x2,y2;
char a[110][110];
char s1[110];
char s2[110];
int flag=0;
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
scanf(" %c",&a[i][j]);
if(a[i][j]=='A')
{
x1=i;
y1=j;
}
if(a[i][j]=='L')
{
x2=i;
y2=j;
}
}
}
scanf("%d",&k);
while(k--)
{
scanf("%s %s",s1,s2);
if((strcmp(s1,"Accelerator")==0)&&flag==0)
{
if((strcmp(s2,"down")==0)&&(a[x1+1][y1]!='*'&&x1+1<=n))
{
x1+=1;
l++;
}
else if((strcmp(s2,"left")==0)&&(a[x1][y1-1]!='*'&&y1-1>=1))
{
y1-=1;
l++;
}
else if((strcmp(s2,"right")==0)&&(a[x1][y1+1]!='*'&&y1+1<=m))
{
y1+=1;
l++;
}
else if((strcmp(s2,"up")==0)&&(a[x1-1][y1]!='*'&&x1-1>=1))
{
x1-=1;
l++;
}
if(x1==x2&&y1==y2)
{
flag=1;
}
}
else if((strcmp(s1,"LastOrder")==0)&&flag==0)
{
if((strcmp(s2,"down")==0)&&(a[x2+1][y2]!='*'&&x2+1<=n))
{
x2+=1;
l++;
}
else if((strcmp(s2,"left")==0)&&(a[x2][y2-1]!='*'&&y2-1>=1))
{
y2-=1;
l++;
}
else if((strcmp(s2,"right")==0)&&(a[x2][y2+1]!='*'&&y2+1<=m))
{
y2+=1;
l++;
}
else if((strcmp(s2,"up")==0)&&(a[x2-1][y2]!='*'&&x2-1>=1))
{
x2-=1;
l++;
}
if(x1==x2&&y1==y2)
{
flag=2;
}
}
}
if(flag==1)
printf("Accelerator\n");
if(flag==2)
printf("MisakaMisaka\n");
printf("%d\n",l);
return 0;
}: