新城已无旧少年


私信TA

用户名:s573877411

访问量:19799

签 名:

人类的悲喜并不相通,我只是觉得他们吵闹.

等  级
排  名 195
经  验 6625
参赛次数 1
文章发表 19
年  龄 20
在职情况 学生
学  校 西安工程大学
专  业 大数据

  自我简介:

静,不是外在无声,而是内心无争

解题思路:

首先我们在考场上面首先想到的肯定是循环没错了,但是这题目出的很巧妙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分

103 人评分

  评论区

#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);
}
2024-03-20 22:41:20
#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);
}求大神们解答哪里不对,本人只是小白求解答
2024-03-06 15:21:22
我这个比较简便但是只能拿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;
2023-11-26 21:09:40
我这样改了一下
#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;
}
2023-08-22 21:00:31
第二个优质解是存在错误的呀,自己拿20、10、117这组数据去测,天数是6,正确需要的天数应该是7才符合题目要求,第一种解没发现问题。
2023-08-22 20:54:17
//现在sum=flag*7;
if (n <= 5 * a)
	{
		if ((n % a) == 0)
		{
			printf("\n%lld\n", sum + n / a);
		}
		else
		{
			printf("\n%lld\n", sum + 1 + n / a);
		}
	}
	else
	{
		long long int temp = n - 5 * a;
		if (temp <= b)
		{
			printf("\n%lld\n", sum + 6);
		}
		else
		{
			printf("\n%lld\n", sum + 7);
		}
	}
这样为什么会显示错误?
2023-04-03 20:56:30
这一串是用来做什么的

if(n/a==5)
        {
            sum+=(n-5*a)/b+(n-5*a-b)%1;
             
        }
2023-03-17 18:03:25
#include<stdio.h>
int main()
{
    long int a,b,n,i,w,s=0;
    scanf("%ld %ld %ld",&a,&b,&n);
    w=n/(5*a+2*b);
    s=w*(5*a+2*b);
    for(i=1;i<8;i++){
        if(i%7==6||i%7==0){
            s+=b;
        }
        else{
            s+=a;
        }
        if(s>=n){
            printf("%ld",7*w+i);
            return 0;
        }
    }
    return 0;
}
2023-03-15 20:21:57