题目链接:点击跳转题目
题目背景
原来的题目太简单,现改进让小鱼周末也休息,请已经做过重做该题。
题目描述
有一只小鱼,它平日每天游泳 250 公里,周末休息(实行双休日),假设从周 x (1 ≤ x ≤ 7) 开始算起,过了 n ( n ≤ 106 ) 天以后,小鱼一共累计游泳了多少公里呢?
输入格式
输入两个整数x,n(表示从周x算起,经过n天)。
输出格式
输出一个整数,表示小鱼累计游泳了多少公里。
数组代码如下:
#include<cstdio>
#include<cstring>
#define LL long long
LL solution(int x, int n);
int main(void) {
int x, n;
scanf("%d %d", &x, &n);
printf("%lld\n", solution(x, n));
return 0;
}
LL solution(int x, int n) {
int kilometer[8] = { 0, 250, 250, 250, 250, 250, 0};
LL sum = kilometer[x];
for (int i = 1; i < n; i++) {
sum += kilometer[(x + i) % 7];
}
return sum;
}
数学方法:这是真的不好想啊,看了别人题解上正好有这种。
#include<cstdio>
#include<cstring>
#define LL long long
LL solution(int x, int n);
int main(void) {
int x, n;
scanf("%d %d", &x, &n);
printf("%lld\n", solution(x, n));
return 0;
}
LL solution(int x, int n) {
LL kilometer = 0;
if (n == 0)
return 0;
int weekDay = n / 7 * 5;//整周的工作日
int modDay = n % 7;//剩余的天
if (modDay > 0) {
if (x == 7 || modDay + x == 7)//开始的时候是周末,那么周末不游。 而且假如x+modDay = 7,那么最后一天是周六
modDay--;//比如周一开始游三天,那么到1+3=4,但是只在周一周二周三游,即周三是最后一天
else if (x + modDay >= 8)//那么周六周日都没有游
modDay -= 2;
}
kilometer = (weekDay + modDay) * 250;
return kilometer;
}