1 条题解

  • 0
    @ 2025-8-24 21:16:44

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Igallta
    「この世には愛も知らない人が 沢山いるんですよ」

    搬运于2025-08-24 21:16:43,当前版本为作者最后更新于2024-11-19 15:41:10,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题意

    一共有 nn 个课程,对于每个课程,给出 wwdd,第 xx 周的时候,如果满足 (d1)÷x(d-1)\div x 的余数是 00(d1)modx=0(d-1) \mod x = 0)那这一周的星期 ww 就要上这门课。

    而且:当前这一天是第一周星期六

    问你,距离这一天最近的课还有多久上课。

    思路

    首先,我们要输入。

    cin>>n;
    for(int i=1;i<=n;i++){
    	cin>>x>>y;
    //  .....
    }
    

    然后,我们思考:其实这道题就是算出每一节课距离当天的时间再取里面的最小值就可以了!

    于是,我们使用一个变量 ansans 来记录最小值,记录最小值,那么初始值就要是一个极大的值,这样才能去记录最小值,否则初始值就会变成最小值。

    我们在信息学竞赛中一般使用 0x3f3f3f3f、0x7f7f7f7f、INT_MAX、1e9 等作为极大值。

    int ans=0x3f3f3f3f;
    

    现在,我们定义 kk 是距离这一天的天数,我们来思考一下。

    首先,题目说间隔 dd 周,但是,最后一周不是一个整的周。(最后一周的间隔天数并非 77 天,因为那一周在周中开课了)

    所以我们在处理间隔 dd 周时 kk 应该加 7(d1)7(d-1) 而不是 7d7d

    再处理星期 ww 开课。你要知道,mm 个数的间隔数是 m1m-1。所以,我们先 +1+1 让它变为星期天,然后直接加 ww,因为星期天到任意一个星期 pp 都是直接加 pp。(你也可以理解为间隔数都是 pp

    所以,我们便可以计算出 kk

    int k=x+1+(y-1)*7;
    

    然后再一直计算最小值,这部分的代码:

    for(int i=1;i<=n;i++){
    	cin>>x>>y;
    	int k=x+1+(y-1)*7;
    	if(ans>k){//如果最小值大了
    		ans=k;
    	}
    }
    

    最后记得输出!

    cout<<ans;
    

    总结

    本题考查同学们的日期日历计算能力和最小值最大值的编码能力。本题是一道较好的最小值训练题,希望各位以后能熟练掌握日期日历间隔的计算和最小值的计算,不要弄错初始值!

    • 1

    信息

    ID
    10898
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者