新城已无旧少年


私信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()
{
	long long int a,b,n;
	scanf("%lld%lld%lld",&a,&b,&n);
	long long int sum=5*a+2*b;
	long long int ans=7*(n/sum);
	n=n%sum;
	long long int d[]={a,a,a,a,a,b,b},i;
	for(i=0;n>0;i++)
	{
		n-=d[i];
		ans++;
	}
	printf("%lld",ans);
	return 0;
}
2023-03-15 17:55:06
#include<stdio.h>
int main()
{
	long long int a,b,n;
	scanf("%lld%lld%lld",&a,&b,&n);
	long long int sum=5*a+2*b;
	long long int ans=7*(n/sum);
	n=n%sum;
	long long int d[]={a,a,a,a,a,b,b},i;
	for(i=0;n>0;i++)
	{
		n-=d[i];
		ans++;
	}
	printf("%lld",ans);
	return 0;
}
2023-03-15 17:54:39
简单的算法,虽然只能拿80分
#include <stdio.h>
void main()
{
   long long a,b,n;
   long long i, sum=0,days=0;
   scanf("%lld%lld%lld",&a,&b,&n);
   for(i=1;i<=7;i++)
   {
	   days++;
          if(i<=5) sum+=a;
	  
	  if(i>5&&i<=7) sum+=b;
   
	  if(i==7) i=0;

	  if(sum>=n) break;
   
   
   }
    printf("%lld",days);
  

}
2023-03-14 21:53:09
我有个疑问,思路一暴力循环中,先算1—5的if(n<0)是否应该改成if(n<=0),因为题目里问的是“按照计划他将在第几天实现做题数大于等于 n 题”
2023-03-10 09:47:35
#include<stdio.h>
int main()
{
 long long int a,b,n;
 int day= 0;
 scanf("%lld %lld %lld", &a, &b, &n);
 int s = 5 * a + 2 * b;//一周能写的题
 int yu = n % s;//最后不满一周做的题
 int zheng = n / s;//做满了几周
 
 if (yu / a <= 5)
 {
	 day=yu/a+1; 
 }
 else
 {
 	day=5+(yu-5*a)/b+1;
 }
 printf("%lld", zheng * 7 + day);
 return 0;
}
帮帮我吧,有几个答案错误
2023-03-09 21:06:45
请问大佬为什么这样暴力结果答案错误 0分

#include<stdio.h>
int main(){
	long long int a,b,n,sum = 0;
	long long int ans = 0;
	int i = 1;
	scanf("%lld %lld %lld",&a,&b,&n);
	while(sum<n){
		if(i>=1&&i<=5){
			sum+=a;
		}else if(i>=6&&i<=7){
			sum+=b;
		}else{
			i++;
			continue;
		}
		i++;
		ans++;
		i = i%8;
	}
	printf("%lld",ans);
	return 0;
}
2023-02-28 17:50:59
#include<iostream>
using namespace std;
int main()
{
    long long  a, b, n, cnt = 0;
    cin >> a >> b >> n;
    long long week = 0; //计算有几个整个周都在刷题
    long long left = 0; //最后一个周剩余题量
    week = n / (a * 5 + b * 2);
    left = n % (a * 5 + b * 2);
    while(left > 0){  //最后一个周进行循环 
        cnt++;
        if(cnt > 5) left -= b;
        else left -= a;
    }
    cout << cnt + week * 7;
    return 0;
}
2023-02-10 23:11:35
#include<stdio.h>
int main()
{
    int a,b,n;
    int z=0,e=0,k=0;      //a周一到周五每天,b周六周日,n总题数,z周数
    scanf("%d%d%d",&a,&b,&n);
    int c=0,d=0;        
    c=n%(5*a+2*b);
    if(c>5*a)
    {
        e=(c-5*a)/b+5;   //周六周日判断
    }
    else if(c%a==0)    //正好做完
    {
       e=c/a;
    }
    else 
    e=c/a+1;
    
    d=n/(5*a+2*b);
    if(d>=1)
    {
        z=7*d;
        k=z+e;
    }
    else
    k=e;
    
    
    printf("%d",k);
    return 0;
}
2022-12-08 09:43:52