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;
}