A.最后一课
“琪亚娜看着已经逝去的姬子老师,决定不再逃避。”
令我不明白的是,琪亚娜决定不再逃避,为什么要来难为我?
难为不难为的先不说,题目里好像出现了几个熟悉的字眼:
原点,出口,距离,坐标
将这几个关键字联系到一起,我们能想到什么?
对咯!两点间距离公式:d * d = (x1 - x2)²+(y1 - y2)²
可还有一个棘手的问题,琪亚娜在做梦,我们算出来的这个玩意儿对她来说叫理论距离,可是她想知道的是那个叫实际距离的ber ber儿~
怎么办?求呗!
可以看出,这个数学函数是分段函数,并且第二段和第三段的函数值再次使用了这个函数求值
典型的递归函数
典!
看到这里,已经学过函数的你应该茅塞顿开了吧?
代码实现如下:
#include <stdio.h>
#include <math.h>
double f(double d)
{
if(d <= 10) return d;
if(d <= 50) return d + f(d - 5); //递归调用f函数求值
return d + f(d - 20);
}
int main()
{
double x, y; //注意题目要求输出保留四位小数,所以我们这里直接使用浮点数类型的变量存储
scanf("%lf %lf",&x, &y);//读入终点坐标
printf("%.4lf", f(sqrt(x * x + y * y)));//向f函数传递理论距离,并将函数结果(返回值)输出
return 0;
}
C.罪人挽歌
又是你啊琪亚娜,你反思自己就反思自己,成天来折磨我干嘛┗|`O′|┛
我愿将琪亚娜视为我的一生之敌
读过题目后我们可以获取的信息有:
第奇数天,我的一生之敌会修炼8小时,而第偶数天,她会修炼6小时
每修炼一小时,她就会增加k点战斗力,那么她每修炼两天,就会固定增长(8 + 6)* k点战斗力
她的目标呢?战斗力大于等于m
需要注意的是,她的初始战斗力为n,所以她需要增长m - n点战斗力
每两天可以增长(8 + 6)* k点战力,我们自然是可以看她需要经历几次双修连续两天修炼的
怎么看?这样看:x = (m - n) / (14 * k); (ps:8 + 6 = 14)
这样我们拿到的x就是她需要连续修炼两天的次数,即她需要修炼2 * x天;
但是,如果m - n不是 14 * k的整数倍,我们就需要去另外算他剩余需要修炼的战斗力点数了
剩余所需修炼的战斗力点数为:y =(m - n) % (14 * k);
显然,这些战斗力点数是不足以让她修炼超过两天的,那么我们只需要看是需要修炼1天还是2天就可以了
由于之前的修炼是双修(两天两天修的),所以下一次修炼还是从奇数天开始
修炼第一天为8小时,第二天为6小时
如果y等于0,则她不需要额外的修炼天数
如果y大于0且小于等于8 * k,则需要额外修炼一天
如果y大于8 * k,则需要额外修炼两天
理论成立,代码实现如下:
//注意数据范围0<=n<=m<=1e12,需要开long long
#include <stdio.h>
long long cnt;
int main()
{
long long n, m, k;
scanf("%lld%lld%lld",&m,&n,&k);
m -= n;
cnt += m / (14 * k) * 2; //双修次数
m %= 14 * k;
if(m > 8 * k) cnt += 2; //多修两天
else if(m) cnt += 1; //多修一天
printf("%lld", cnt);
return 0;
}
D.渡尘
先看题,很好,这题没有琪亚娜
符华你是数龟的吗?碰到不喜欢的年份还能冬眠的?
这题看似很复杂,其实思路很简单:
我们首先去遍历从1到50000之间的所有年份,每次定义一个变量flag用于标记,如果flag的值 为1,代表当前年份计入符华总年龄,否则不计入
对于每一个年份i的判断,我们要考虑两点:
1、当前年份是否是x的倍数
2、当前年份的每一位中是否有x
上述两点任意一点成立,我们都需要改变变量flag的值为0,表示当前年份不计入符华总年龄
代码实现如下:
#include <stdio.h>
int main()
{
int n = 50000, i, x, cnt = 0;
scanf("%d",&x);
for(i = 1; i <= n; i ++)
{
int k = i, flag = 1;
while(k > 0)
{
if(k % 10 == x) //判断当前最后一位是否是x
{
flag = 0;
break;
}
k /= 10; //舍去当前最后一位(如123 / 10 == 12)
}
if(i % x == 0) flag = 0;
if(flag) cnt ++;
}
printf("%d", cnt);
return 0;
}
E.薪炎永燃
解:由题意得:
设cnt为以点(i,j)为左上角顶点的3*3矩形中敌人数量的和
题目要求我们找炮弹能够消灭的最多的敌人数量,则我们需要去遍历每一个3*3矩形(即遍历点(i,j),求得每一个矩形的cnt),用max去记录当前遍历过的矩阵的最大值,每次用cnt与max比较,如果cnt的值大于max,则将cnt的值赋给max,最后输出max即可。
理论成立,代码实现如下:
#include <stdio.h>
int n, q[1010][1010];
int main()
{
scanf("%d",&n);
int i, j, k, l, max = 0;
for(i = 1; i <= n; i ++)
{
for(j = 1; j <= n; j ++)
{
scanf("%d",&q[i][j]);
}
}
int cnt;
for(i = 1; i <= n - 2; i ++)
{
for(j = 1; j <= n - 2; j ++)
{
cnt = q[i][j] + q[i][j + 1] + q[i][j + 2] + q[i + 1][j] + q[i + 1][j + 1] + q[i + 1][j + 2] + q[i + 2][j] + q[i + 2][j + 1] + q[i + 2][j + 2];
if(cnt > max)
{
max = cnt;
}
}
}
printf("%d", max);
return 0;
}
F.阿波卡利斯如是说
主教:或许用这玩意儿能秒了他?
由于主教已身受重伤,只能释放最多两次攻击,而我们有三种攻击方式,若要判断能否击败怪兽,只需判断造成伤害最多的两次攻击造成的伤害之和是否大于怪兽血量即可。
首先读入n与m,分别代表武器种类数和怪兽血量
接下来进行n轮循环,每轮循环中再用循环去读入三种攻击方式造成伤害数,用sum表示三种攻击方式伤害数之和,min表示三种攻击伤害的最小值
sum - min即为伤害数最高的两次攻击的伤害点数之和
我们用sum - min与m进行比较,若sum - min >= m,则可以击败怪物,否则不能击败
ans用于记录可以击败怪物的武器种类数
代码实现如下:
#include <stdio.h>
int main()
{
int n, m, i, ans = 0;
scanf("%d%d",&n,&m);
while(n --)
{
long long x, sum = 0, min = 1e10;
for(i = 1; i <= 3; i ++)
{
scanf("%lld", &x);
sum += x;
if(x < min) min = x;
}
if(sum - min >= m)
{
printf("Yes\n");
ans ++;
}
else printf("No\n");
}
printf("%d", ans);
return 0;
}
G.因你而在的故事
如果这题你不会,请去复习/预习课本中循环章节的知识
如果你看不懂课本,请自行搜索翁恺C语言或其他视频自行学习
如果你还是没学会,请将这道题视为你的一生之敌
如果你来问我,那么我会将你视为我的一生之敌
代码实现如下:
for循环实现
```
#include <stdio.h>
int main()
{
int i;
for(i = 1; i <= 520; i ++)
{
printf("回应我吧,爱莉希雅!\n");
}
return 0;
}
```
while循环实现
```
#include <stdio.h>
int main()
{
int n = 520;
while(n --)
{
printf("回应我吧,爱莉希雅!\n");
}
return 0;
}
```
H.毕业旅行
我们定义两个字符数组a,b用来存储字符串
其中a用来存储 "Lovestory",b用来存储每轮测试读入的字符串
在每轮测试中,我们将字符串存入字符数组b中,并将其与字符数组a进行逐位对比
用整型变量k记录两字符串之间相同下标不同元素的位置的数量
如果k为0,则说明a与b完全相同,输出 "This is a story about love!"
否则输出k
注意每轮测试输出后的换行
#include <stdio.h>
#include <string.h>
char a[10] = {'L','o','v','e','s','t','o','r','y'}, b[10]; //对a数组进行集成初始化,让其存储字符串 "Lovestory"
int main()
{
int n, i;
scanf("%d",&n);
while(n --)
{
scanf("%s",b);
int k = 0;
for(i = 0; i < 9; i ++)
{
if(a[i] != b[i]) k ++;
}
if(k != 0) printf("%d\n",k);
else printf("This is a story about love!\n");
}
return 0;
}