PAT (Advanced Level) Practice——1005,1006

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

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目描述中提到了一个问题:pat 1005乙级。根据引用的描述,每个测试用例包含两行输入,第一行是一个正整数K,第二行是K个互不相同的正整数n的值。根据引用,给出了一段C++代码,该代码解决了这个问题,其中涉及到了一个set_list函数和一个print_output函数。根据引用,还给出了另一段模拟C代码,也解决了这个问题,其中使用了vector和sort等STL库函数。根据这些引用内容,可以给出以下回答: 根据题目描述和代码内容,pat 1005乙级是一个关于卡拉兹猜想的问题。题目要求给定一个序列,对于序列中的每个数,按照卡拉兹猜想进行递推,并标记递推过程中被覆盖的数。最后,输出未被标记过的数。根据代码中的set_list函数和print_output函数,可以解决这个问题。其中set_list函数用于标记递推过程中被覆盖的数,print_output函数用于输出未被标记过的数。另外,根据引用给出的模拟C代码,还使用了vector和sort等STL库函数来简化代码实现。 因此,要解决pat 1005乙级的问题,可以参考上述提供的C++代码,使用set_list函数标记被覆盖的数,并使用print_output函数输出未被标记过的数。同时,可以考虑使用STL库函数来简化代码实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [PAT乙级1005](https://blog.csdn.net/lonely_daisy/article/details/119218256)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [PAT乙级题解1005(超级详细分析,看完就懂)](https://blog.csdn.net/m0_58472103/article/details/126552607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值