杭电网安复试编程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;
}
相关推荐
Jerry36 分钟前
LeetCode 189. 轮转数组
算法
Jerry1 小时前
LeetCode 739. 每日温度
算法
2601_954526756 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
code_pgf6 小时前
`unordered_map` 详解
c++
叩码以求索7 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
一拳一个呆瓜8 小时前
【STL】iostream 编程:检测提取操作产生的错误
c++·stl
稚南城才子,乌衣巷风流8 小时前
判断素数与拓展应用
c++
众少成多积小致巨8 小时前
C++ 规范参考(下)
c++
c238568 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
aaaameliaaa9 小时前
指针之总结
c语言·笔记·算法