1 条题解

  • 0
    @ 2025-8-24 23:12:49

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar wwwwwwqqqqq111
    艾拉母牛!(陈年老梗)

    搬运于2025-08-24 23:12:49,当前版本为作者最后更新于2025-06-13 19:47:34,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    洛谷 P12110 题解

    解题思路

    这题我觉得我们可以用如下的思路解答:

    第一步

    首先先定义两个数组,分别用来存储小时和分钟。
    再根据 nn 的值确定循环次数,在输入小时与分钟的过程中进行单位转换,什么意思呢?下面是公式:mihi×60+mim_i \gets h_i \times 60 + m_i
    其中 mim_i 指的是分钟 hih_i 指的是小时。
    把已有小时转化为分钟,再与现有分钟数相加。
    因为不乏有一些数据会牵扯到进位,所以对于数据而言显然全部转化成分钟才是明智之举。

    第二步

    这里我用的是筛选的方法做的。大意。先筛选出结果为 00 的答案,再筛选出 11 的,以此类推,33 不用考虑,因为 10n110 \ge n \ge 1,但凡能输入一个数,都是无法输出 33 的。
    不懂的仔细想想。

    编程思路

    1. mi+2mi10mi+2mi>0m_{i+2} - m_i \le 10 \land m_{i+2} - m_i > 0,筛出结果为 00 的。
    2. mi+1mi10mi+1mi>0m_{i+1} - m_i \le 10 \land m_{i+1} - m_i > 0,筛出结果为 11 的。
    3. 现在只剩下结果 22 答案了,还需要考虑吗?直接 cout<<2; 程序结束。

    Code

    声明一下,这篇不是重复题解!!!

    #include<bits/stdc++.h>
    using namespace std;
    int h[25],m[25];//防止数组越界 
    int main(){
    	char k;
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
        	cin>>h[i]>>k>>m[i];
        	m[i]+=h[i]*60;//高级单位换算成低级单位乘进率 
    	}
    	//列举 
    	for(int i=1;i<=n;i++){
    		if(m[i+2]-m[i]<=10&&m[i+2]-m[i]>0){
    			cout<<0;
    			return 0;
    		}
    	}
    	for(int i=1;i<=n;i++){
        	if(m[i+1]-m[i]<=10&&m[i+1]-m[i]>0){
        		cout<<1;
        		return 0;
    		}
    	}
    	cout<<2;
        return 0;
    }
    
    • 1

    信息

    ID
    11964
    时间
    2000ms
    内存
    1024MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者