大佬题解
不用循环
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
long long a, b, n, ans;
int main()
{
cin >> a >> b >> n;
long long week = 5 * a + 2 * b;
ans = n / week * 7;
n %= week;
if(n <= 5 * a)
{
ans += n / a + (n % a == 0 ? 0 : 1);
}
else
{
n -= 5 * a;
ans += 5 + n / b + (n % b == 0 ? 0 : 1);
}
cout << ans;
return 0;
}
对总题数进行合理枚举
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; // 由于数据范围最大为10的18次方,用long long
ll a, b, n;
ll days, s; // days 记录天数, s记录每周刷题总数
int main(){
cin >> a >> b >> n;
s = 5 * a + 2 * b;
days += n / s * 7; // 先让days加上题目可以刷几周的天数(可以极大的减少循环次数,降低时间复杂度)
n %= s; // 剩下的就是不足一周的题目数了
for (int i = 1; i <= 7; i ++){ //枚举(最多只用循环7次)
if (n <= 0) break;
if (i <= 5) //周一至周五每天做 a 道题目
n -= a;
else //周六和周日每天做 b 道题目。
n -= b;
days ++;
}
cout << days;
return 0;
}
巧设数组算法
#include <iostream>
#include <cstring>
#include <algorithm>
typedef long long LL;
using namespace std;
int main()
{
LL a,b,n;
cin >> a >> b >>n;
LL s=5*a+2*b;
LL res=n/s*7;
n%=s;
LL d[]={a,a,a,a,a,b,b};
for(int i=0;n>0;i++)
{
n-=d[i];
res++;
}
cout <<res<<endl;
return 0;
}
模拟算法
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
long long a,b,n,week_num,week_day,day,n1;
cin>>a>>b>>n;
week_num=5*a+2*b; //刷题总数
if(n%week_num==0) day=n/week_num*7;
else
{
week_day=n/week_num*7,n1=n%week_num; //n1表示剩余题的数量
if(n1<=5*a)
{
if(n1%a==0) day=week_day+(n1/a);
else if(n1%a!=0) day=week_day+(n1/a)+1;
}
else if(n1>5*a&&n1<week_num)
{
if(n1<=b+5*a) day=week_day+6;
else if(n1<=2*b+5*a) day=week_day+7;
}
}
cout<<day<<endl;
return 0;
}