解题思路:
首先我们在考场上面首先想到的肯定是循环没错了,但是这题目出的很巧妙n的最大值大到了1018所以数据量太大了,我们就不能简单的用循环来做了.
思路一:暴力循环(只能拿80分,时间超限了)
思考一下我们循环的目的是什么?不就是为了从第1天算到答案所需要的那一天,然后一星期一星期的循环,那我们直接利用除法和求余就可以代替循环的过程对吧.
先给大家看下循环做法,写的可能很繁琐,但是过程很清晰(只能拿80分,很明显时间超限了)
#include<stdio.h>
long long int f(long long int n,long long int a,long long int b) //n代表总题数,a代表星期一到星期五做的题的数量,b代表星期六和星期天做题的数量
{
int flag;
long long int sum=0; //flag用来记录最后是在1-5停的,还是在6-7停的
while(n!=0)
{
n-=5*a; //先算1-5
if(n<0)
{
flag=1;
break;
}
sum+=5;
n-=2*b; //再算6-7
if(n<0)
{
flag=2;
break;
}
sum+=2;
}
if(flag==1) //如果是在1-5停的话
{
n+=5*a; //加回来,然后算是在第几天的
while(n>a)
{
n-=a;
sum++;
}
sum++; //不满一天就加回去
}
else if(flag==2)
{
n+=2*b;
while(n>b)
{
n-=b;
sum++;
}
sum++;
}
return sum;
}
int main()
{
long long int a,b,n;
scanf("%lld%lld%lld",&a,&b,&n);
printf("%lld",f(n,a,b));
return 0;
}看起来上面的循环来做时间复杂度是o(n/(a+b)),前提是你用int类型的数据,它占了四个字节,运行会快一点,但是你改成long long int的话占16个字节,所以运行起来更慢,肯定就超时了
思路二:利用flag记录来避过循环(满分AC):
所以我们换到另一种思路直接利用flag我们记录总共可以进行多少个完全周(指的是1-7全部完成的),然后直接算最后那一周就刚好避过了循环:
flag=n/(a*5+b*2); //flag就是记录总共可以进行多少个完全周 n-=(a*5+b*2)*flag; //然后直接减 sum+=flag*7; //sum就要加上进行的天数
代码实现:
#include<stdio.h>
int main()
{
long long int a,b,n,sum=0;
scanf("%lld%lld%lld",&a,&b,&n);
long long int flag=n/(a*5+b*2);
n-=(a*5+b*2)*flag;
sum+=flag*7;
if(n/a<=5)
{
sum+=n/a;
if(n/a==5)
{
sum+=(n-5*a)/b+(n-5*a-b)%1;
}
else if(n%a>0)
{
sum++;
}
}else{
sum+=5+(n-5*a)/b;
if((n-5*a)%b>0)
{
sum++;
}
}
printf("%lld",sum);
return 0;
}0.0分
48 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include<stdio.h> int main(){ int a,b,n; scanf("%d %d %d",&a,&b,&n); int week=n/(5*a+2*b); n=n%(5*a+2*b); int day; if(n/10>5){ if(n-5*a<=b){ day=6; } else if(n-5*a>b&&n-5*a<=2*b){ day=7; } } else{ if(n%10!=0){ day=n/10+1; }else{ day=n/10; } } int num_day=7*week+day; printf("%d",num_day); }#include<stdio.h> int main() { long long a,b,n; scanf("%lld%lld%lld",&a,&b,&n); int t=n/(5*a+2*b); int num=n-t*(5*a+2*b); int day=t*(5+2); long long s=t*(5*a+2*b); for(day=1;s<=n;day++)// 剩下的天数肯定是小于7天的 { if(day==6||day==7) { s=s+b; } else { s=s+a; } } printf("%lld",t+day); }求大神们解答哪里不对,本人只是小白求解答我这个比较简便但是只能拿80分为什么 #include<stdio.h> int main() { long long int a,b; long long int i=1; long long int count=0,n; long long int sum=0; scanf("%lld %lld",&a,&b); scanf("%lld",&n); while(i<=8) { if(i<=5) { sum=sum+a; count++; } if(i>5&&i<=7) { sum=sum+b; count++; } if(sum>=n) { break; } if(i==7) { i=0; } i++; } printf("%lld\n",count); return 0;我这样改了一下 #include<stdio.h> int main() { long long int a,b,n,sum=0; scanf("%lld%lld%lld",&a,&b,&n); long long int flag=n/(a*5+b*2); n-=(a*5+b*2)*flag; sum+=flag*7; if(n/a<=5) { sum+=n/a; if(n/a==5) { sum+=(n-5*a)/b; n = (n-5*a)/b; if(n % b > 0) { sum++; } } else if(n%a>0) { sum++; } }else{ sum+=5+(n-5*a)/b; if((n-5*a)%b>0) { sum++; } } printf("%lld",sum); return 0; }