杭电网安复试编程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;
}
相关推荐
折哥的程序人生 · 物流技术专研5 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
玖玥拾6 小时前
C/C++ 基础笔记(十四)多态与模板编程
c语言·c++·多态·模板
想吃火锅10056 小时前
【leetcode】14.最长公共前缀js
算法·leetcode·职场和发展
Roann_seo%7 小时前
C++文件操作完全指南:从文本读写到二进制文件处理
开发语言·c++
坚果派·白晓明7 小时前
【鸿蒙PC】SDL3 适配:AtomCode + Skills 快速集成 NAPI 测试工具
c++·华为·ai编程·harmonyos·atomcode
云絮.8 小时前
数据库操作
数据库·mysql·算法·oracle
小林ixn8 小时前
LeetCode 206. 反转链表(迭代 + 递归详解)
算法·leetcode·链表
凡人叶枫8 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
凡人叶枫9 小时前
Effective C++ 条款16:成对使用 new 和 delete 时要采取相同形式
开发语言·c++·effective c++
菜鸟‍9 小时前
LeetCode 1 27 和 704 || 两数之和 移除元素 二分查找
算法·leetcode·职场和发展