杭电网安复试编程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;
}
相关推荐
小李子呢021113 小时前
前端八股6---v-model双向绑定
前端·javascript·算法
史迪仔011213 小时前
[QML] QML IMage图像处理
开发语言·前端·javascript·c++·qt
2301_8227032014 小时前
Flutter 框架跨平台鸿蒙开发 - 创意声音合成器应用
算法·flutter·华为·harmonyos·鸿蒙
cmpxr_14 小时前
【C】数组名、函数名的特殊
c语言·算法
KAU的云实验台14 小时前
【算法精解】AIR期刊算法IAGWO:引入速度概念与逆多元二次权重,可应对高维/工程问题(附Matlab源码)
开发语言·算法·matlab
会编程的土豆14 小时前
【数据结构与算法】再次全面了解LCS底层
开发语言·数据结构·c++·算法
低频电磁之道14 小时前
解决 Windows C++ DLL 导出类不可见的编译错误
c++·windows
大熊背15 小时前
如何利用Lv值实现三级降帧
算法·自动曝光·lv·isppipeline
大尚来也15 小时前
驾驭并发:.NET多线程编程的挑战与破局之道
java·前端·算法
向阳而生,一路生花15 小时前
深入浅出 JDK7 HashMap 源码分析
算法·哈希算法