蓝桥杯省赛—刷题统计,小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在第几天实现做题数大于等于 n题?

问题描述

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题?

输入格式

输入一行包含三个整数 a,b 和 n。

输出格式

输出一个整数代表天数。

样例输入

10 20 99

样例输出

8

评测用例规模与约定

对于 50% 的评测用例, 1≤a,b,n≤10^{6}

对于 100%的评测用例, 1≤a,b,n≤10^{18}

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

答案解析

对于 100%的评测用例, 1≤a,b,n≤10^{18}。所以变量的定义都为Long型,用Int定义范围不够,导致部分用例不通过。 

思路:

定义week_sum算出一周的做题数量,定义week算出做题所需周数的整数部分,再将n变为做题week周后还需要的天数,最后用两个循环确定小于一周的天数。

Java

import java.util.Scanner;
public class text05_刷题统计 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        Long a = scan.nextLong();
        Long b = scan.nextLong();
        Long n = scan.nextLong();
        Long week_sum = a * 5 + b * 2;
        Long week = n / week_sum;
        n -= week * week_sum;
        Long main_days = week * 7;
        for (int i = 0;i < 5;i ++){
            if (n>0){
                n-=a;
                main_days ++;
            }
        }
        for (int i = 0;i < 2;i ++){
            if (n > 0){
                n-=b;
                main_days++;
            }
        }
        System.out.println(main_days);
        scan.close();
    }
}

C++

#include 
using namespace std;
int main() {
    long long int a,b,n,i,j,k,sum,sum1=0,t;
    cin>>a>>b>>n;
    sum=5*a+2*b;//一周做的题
    k=n/sum;//做了几周
    t=n-sum*k;//做完最大整周剩的题
    if(t==0) {
        cout<<7*k;//如果不剩题直接输出
    }
    else {
        for(i=1;;i++) {//寻找剩下的题几天能做完
            if(i%7!=6&&i%7!=0) {
                sum1+=a;
            }
            else {
                sum1+=b;
            }
            if(sum1>=t) {
                break;
            }
        }
        cout<<7*k+i;
    }
    return 0;
}

python3

a,b,n = map(int,input().split())
week = a*5 + b*2  #计算总的做题数
days = (n//week)*7#做了几个整周的天数
n %= week         #剩余的题数
if n <= 5*a:      #如果剩余的题数,五天能做完
    days += n//a + (0 if n % a == 0 else 1)
    #天数+= 如果剩余的题数做x(n//a)天,每天做a道做完,后面的三目运算返回0天,如果还有没做完的,再加1天
else:    #如果剩余的题数,五天做不完,剩余两天能做完
    days += 5     #加上之前的五天
    n -= 5*a      #减去五天的做题数
    days += n//b + (0 if n % b == 0 else 1)
    #天数+= 如果剩余的题数做x(n//b)天,每天做b道做完,后面的三目运算返回0天,如果还有没做完的,再加1天
print(days)

C

#include
int main()
{
    long long  int day=1;//表示周几天
    long long int num=0;
    long long int ans=0;
    long int long n;
    long int long a,b;
    scanf("%lld %lld",&a,&b);
    scanf("%lld",&n);
     //注意,这里不能直接暴力的例举,会有部分超时
    int long long sum=a*5+b*2;
    int long long  weeks=n/sum;//可以被sum整除的
    num+=7*weeks;
    int unfull_weeks=n%sum;//不可以被sum整除的
    for(int i=unfull_weeks;i>0;)
    {
        if(day==7)
            day=1;
        if(day%7==6||day%7==0) i-=b;
        else i-=a;
        num++;
        day++;
    }
    printf("%lld",num);
    return 0;
}

你可能感兴趣的:(蓝桥杯题解,蓝桥杯,算法,java,python,c++)