杭电网安复试编程Day23

1、时间格式

简要描述:输入一个数,代表要检测的例子的个数,每个例子中:

输入两个时间(格式HH:MM:SS),前面时间减去后面时间,输出在时钟上显示的时间,格式一样,如果是以为数字的前面补零。

cpp 复制代码
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
int n;
string s1,s2;
int tosec(string s)
{
	int hour=(s[0]-'0')*10+(s[1]-'0');
	int minute=(s[3]-'0')*10+(s[4]-'0');
	int second=(s[6]-'0')*10+(s[7]-'0');
	int sum=hour*3600+minute*60+second;
	return sum;
}
int main()
{
	cin>>n;
	while(n--)
	{
		cin>>s1>>s2;
		int x=tosec(s1)-tosec(s2);
		// 若结果为负,加上 24 小时(时钟显示)
		if(x<0) x+=86400;
		int hour=x/3600;
		int minute=x%3600/60;
		int second=x%60;
		cout<<setw(2)<<setfill('0')<<hour<<":"
			<<setw(2)<<setfill('0')<<minute<<":"
			<<setw(2)<<setfill('0')<<second<<endl;
	}
	return 0;
}

2、判断说谎

简要描述:一个活动有N个人参加,一个主持人和N-1个普通参加者,其中所有的人都认识主持人,主持人也认识所有的人,主持人要求N-1个参加者说出他们在参加者中所认识的人数,如果A认识B,则B认识A,所以最少是会认识一个人,就是主持人,他们说出了自己所认识的人数后,需要判断他们中有没有人说谎。

输入:

第一行是N,N=0表示结束

第二行是N-1个数字

输出:

Lie absolutely 或者 Maybe truth

cpp 复制代码
7
1 2 4 5 5 3
9
3 7 7 7 7 5 6 6

两个测试例子中第一个是Lie absolutely,第二个是Maybe truth

cpp 复制代码
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1005;
int n;
int m[N];

bool cmp(int x, int y) {
    return x > y;
}

int main() {
    while (cin >> n && n != 0) {
        if (n == 1) {
            // 只有主持人,没有普通人,必然成立
            cout << "Maybe truth" << endl;
            continue;
        }

        int num = n - 1;               // 普通参加者人数
        bool lie = false;

        for (int i = 0; i < num; i++) {
            cin >> m[i];
            m[i] -= 1;                 // 减去主持人,得到在普通人中需要的朋友数
            if (m[i] < 0) lie = true;  // 认识人数必须 ≥1
        }

        if (lie) {
            cout << "Lie absolutely" << endl;
            continue;
        }

        // Havel-Hakimi 算法
        int cnt = num;                 // 当前剩余人数
        while (cnt > 0) {
            // 1. 降序排序前 cnt 个元素
            sort(m, m + cnt, cmp);

            // 2. 如果最大度数为 0,说明所有人都满足
            if (m[0] == 0) break;

            // 3. 取出最大度数 d
            int d = m[0];

            // 4. 如果 d 大于剩余人数(除自己外),不可能
            if (d > cnt - 1) {
                lie = true;
                break;
            }

            // 5. 将后面 d 个人的度数各减 1
            for (int i = 1; i <= d; i++) {
                m[i]--;
                if (m[i] < 0) {
                    lie = true;
                    break;
                }
            }
            if (lie) break;

            // 6. 移除第一个元素(最大度数的人),剩余人数减 1
            //    将后面的元素前移一位
            for (int i = 1; i < cnt; i++) {
                m[i - 1] = m[i];
            }
            cnt--;
        }

        if (lie)
            cout << "Lie absolutely" << endl;
        else
            cout << "Maybe truth" << endl;
    }
    return 0;
}
相关推荐
灰色小旋风2 小时前
力扣16 最接近的三数之和(C++)
数据结构·c++·算法·leetcode
FMRbpm2 小时前
前缀和与差分:总结与梳理
算法·前缀和·差分
yuzhuanhei2 小时前
C++进阶(上)
开发语言·c++
C+-C资深大佬2 小时前
C++ 性能优化 专业详解
java·c++·性能优化
Tisfy2 小时前
LeetCode 3643.垂直翻转子矩阵:原地修改
算法·leetcode·矩阵·模拟
噜啦噜啦嘞好2 小时前
算法篇:滑动窗口
数据结构·算法
无限进步_2 小时前
【C++】单词反转算法详解:原地操作与边界处理
java·开发语言·c++·git·算法·github·visual studio
吗~喽2 小时前
【C++】模板的两大特性
c++
泯泷2 小时前
从零构建寄存器式 JSVMP:实战教程导读
前端·javascript·算法