1005:
首先这里的N特别大,所以我们可以用string来储存。
接着我们可以用映射关系来把数字转化为对应的英文,这个时候用了一个技巧,sum转化为字符串后,就不用倒着得到每一位输出了,这样比较方便。
注意:sum转化为字符串后,ans[i]的值是字符。
#include <bits/stdc++.h>
using namespace std;
string s;
map<char ,string> mp = {{'0',"zero"},{'1',"one"},{'2',"two"},{'3',"three"},{'4',"four"},{'5',"five"},
{'6',"six"},{'7',"seven"},{'8',"eight"},{'9',"nine"}};
int main() {
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> s;
int sum = 0;
for(int i = 0; i < s.size(); i++){
sum += s[i] - '0';
}
string ans = to_string(sum);
for(int i = 0; i < ans.size(); i++){
cout << mp[ans[i]];
if(i != ans.size() - 1) cout << " ";
}
return 0;
}
1006:
题意:
每天开始的时候,第一个在电脑室签名的人会打开门,最后一个签名离开的人会锁上门。根据签到和签出的记录,找到当天开门和锁门的人。
每个输入文件包含一个测试用例。每个测试用例里都有一天的记录。本例以正整数M开始,M是记录的总数,单独占一行,后面是M行,每一行的格式是: ID_number Sign_in_time Sign_out_time
于每个测试用例,在一行中输出当天锁门和开锁人员的ID号。两个ID号之间必须用一个空格隔开。
注:保证记录一致。也就是说,每个人的签到时间必须早于签到时间,并且不能有两个人同时签到或签到。
法一:
这里我的基本思路是把字符串中的时分秒给分解出来,通过sort函数的比较函数来完成最早的和最晚的排序即可
#include <bits/stdc++.h>
using namespace std;
typedef struct {
string id,start,End;
}Peo;
bool cmp1(Peo a, Peo b)
{
string ha = a.start.substr(0,2);
string hb = b.start.substr(0,2);
return ha < hb;
string ma = a.start.substr(3,5);
string mb = b.start.substr(3,5);
return ma < mb;
string sa = a.start.substr(6,8);
string sb = b.start.substr(6,8);
return sa < sb;
}
bool cmp2(Peo a, Peo b)
{
string ha = a.End.substr(0,2);
string hb = b.End.substr(0,2);
return ha > hb;
string ma = a.End.substr(3,5);
string mb = b.End.substr(3,5);
return ma > mb;
string sa = a.End.substr(6,8);
string sb = b.End.substr(6,8);
return sa > sb;
}
int main() {
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n; cin >> n;
vector<Peo> a(n);
for(int i = 0; i < n; i++) cin >> a[i].id >> a[i].start >> a[i].End;
sort(a.begin(),a.end(),cmp1);
cout << a[0].id << " ";
sort(a.begin(),a.end(),cmp2);
cout << a[0].id << "\n";
//测试substr
// string a = "15:30:28",b = "08:00:00";
// string ha = a.substr(0,2);
// string hb = b.substr(0,2);
// cout << ha << " " << hb;
// string sa = a.substr(6,8);
// string sb = b.substr(6,8);
// cout << sa << " " << sb;
return 0;
}
另一种方法:
将时间都转换为总秒数,最早和最迟的时间保存在变量minn和maxn中,并同时保存当前最早和最迟的人的ID,最后输出。
来源于1006. Sign In and Sign Out (25)-PAT甲级真题_1006 sign in and sign out测试点-CSDN博客
#include <iostream>
#include <climits>
using namespace std;
int main() {
int n, minn = INT_MAX, maxn = INT_MIN;
scanf("%d", &n);
string unlocked, locked;
for(int i = 0; i < n; i++) {
string t;
cin >> t;
int h1, m1, s1, h2, m2, s2;
scanf("%d:%d:%d %d:%d:%d", &h1, &m1, &s1, &h2, &m2, &s2);
int tempIn = h1 * 3600 + m1 * 60 + s1;
int tempOut = h2 * 3600 + m2 * 60 + s2;
if (tempIn < minn) {
minn = tempIn;
unlocked = t;
}
if (tempOut > maxn) {
maxn = tempOut;
locked = t;
}
}
cout << unlocked << " " << locked;
return 0;
}