原題鏈接:
PTA | 程序設(shè)計(jì)類實(shí)驗(yàn)輔助教學(xué)平臺(tái)
題目描述:
為了抗擊來勢洶洶的 COVID19 新型冠狀病毒,全國各地均啟動(dòng)了各項(xiàng)措施控制疫情發(fā)展,其中一個(gè)重要的環(huán)節(jié)是口罩的發(fā)放。
某市出于給市民發(fā)放口罩的需要,推出了一款小程序讓市民填寫信息,方便工作的開展。小程序收集了各種信息,包括市民的姓名、身份證、身體情況、提交時(shí)間等,但因?yàn)閿?shù)據(jù)量太大,需要根據(jù)一定規(guī)則進(jìn)行篩選和處理,請你編寫程序,按照給定規(guī)則輸出口罩的寄送名單。
輸入格式:
輸入第一行是兩個(gè)正整數(shù)?D?和?P(1≤D,P≤30),表示有?D?天的數(shù)據(jù),市民兩次獲得口罩的時(shí)間至少需要間隔?P?天。
接下來?D?塊數(shù)據(jù),每塊給出一天的申請信息。第?i?塊數(shù)據(jù)(i=1,?,D)的第一行是兩個(gè)整數(shù)?Ti??和?Si?(1≤Ti?,Si?≤1000),表示在第?i?天有?Ti??條申請,總共有?Si??個(gè)口罩發(fā)放名額。隨后?Ti??行,每行給出一條申請信息,格式如下:
姓名 身份證號 身體情況 提交時(shí)間
給定數(shù)據(jù)約束如下:
-
姓名
?是一個(gè)長度不超過 10 的不包含空格的非空字符串; -
身份證號
?是一個(gè)長度不超過 20 的非空字符串; -
身體情況
?是 0 或者 1,0 表示自覺良好,1 表示有相關(guān)癥狀; -
提交時(shí)間
?是 hh:mm,為24小時(shí)時(shí)間(由?00:00
?到?23:59
。例如 09:08。)。注意,給定的記錄的提交時(shí)間不一定有序; -
身份證號
?各不相同,同一個(gè)身份證號被認(rèn)為是同一個(gè)人,數(shù)據(jù)保證同一個(gè)身份證號姓名是相同的。
能發(fā)放口罩的記錄要求如下:
-
身份證號
?必須是 18 位的數(shù)字(可以包含前導(dǎo)0); - 同一個(gè)身份證號若在第?i?天申請成功,則接下來的?P?天不能再次申請。也就是說,若第?i?天申請成功,則等到第?i+P+1?天才能再次申請;
- 在上面兩條都符合的情況下,按照提交時(shí)間的先后順序發(fā)放,直至全部記錄處理完畢或?Si??個(gè)名額用完。如果提交時(shí)間相同,則按照在列表中出現(xiàn)的先后順序決定。
輸出格式:
對于每一天的申請記錄,每行輸出一位得到口罩的人的姓名及身份證號,用一個(gè)空格隔開。順序按照發(fā)放順序確定。
在輸出完發(fā)放記錄后,你還需要輸出有合法記錄的、身體狀況為 1 的申請人的姓名及身份證號,用空格隔開。順序按照申請記錄中出現(xiàn)的順序確定,同一個(gè)人只需要輸出一次。
輸入樣例:
4 2
5 3
A 123456789012345670 1 13:58
B 123456789012345671 0 13:58
C 12345678901234567 0 13:22
D 123456789012345672 0 03:24
C 123456789012345673 0 13:59
4 3
A 123456789012345670 1 13:58
E 123456789012345674 0 13:59
C 123456789012345673 0 13:59
F F 0 14:00
1 3
E 123456789012345674 1 13:58
1 1
A 123456789012345670 0 14:11
輸出樣例:
D 123456789012345672
A 123456789012345670
B 123456789012345671
E 123456789012345674
C 123456789012345673
A 123456789012345670
A 123456789012345670
E 123456789012345674
樣例解釋:
輸出中,第一行到第三行是第一天的部分;第四、五行是第二天的部分;第三天沒有符合要求的市民;第六行是第四天的部分。最后兩行按照出現(xiàn)順序輸出了可能存在身體不適的人員。文章來源:http://www.zghlxwxcb.cn/news/detail-420445.html
解題思路:
根據(jù)提議模擬即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-420445.html
代碼(CPP):
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e3 + 10;
const int INF = 0x3fffffff;
const int mod = 1000000007;
int D, P;
struct info
{
string name;
string ID;
int status;
int time;
int ord;
};
bool cmp(info &a, info &b)
{
if (a.time == b.time)
return a.ord < b.ord;
return a.time < b.time;
}
map<string, int> mp; // 記錄對應(yīng)身份證號的人上一次領(lǐng)取口罩是在第幾天
map<string, int> mp1; // 身體狀況異常的人是否被標(biāo)記過
vector<info> rec;
vector<info> ans;
vector<info> ans1;
int getTime(string timeStr)
{
int m = 0;
m += ((timeStr[0] - '0') * 10 + (timeStr[1] - '0')) * 60;
m += (timeStr[3] - '0') * 10 + (timeStr[4] - '0');
return m;
}
bool check(string ID)
{
if (ID.size() != 18)
return false;
for (int i = 0; i < ID.size(); i++)
{
if (ID[i] < '0' || ID[i] > '9')
return false;
}
return true;
}
void solve()
{
cin >> D >> P;
for (int i = 1; i <= D; i++)
{
rec.clear();
int t, k;
cin >> t >> k;
for (int j = 0; j < t; j++)
{
string name, ID;
int status, time;
string timeStr;
cin >> name >> ID >> status >> timeStr;
time = getTime(timeStr);
if (!check(ID))
continue;
rec.push_back({name, ID, status, time, j});
if (status && !mp1[ID])
{
ans1.push_back({name, ID, status, time, j});
mp1[ID] = 1;
}
}
if (k == 0)
continue;
sort(rec.begin(), rec.end(), cmp);
int cnt = 0;
for (int j = 0; j < rec.size(); j++)
{
if (!mp.count(rec[j].ID) || mp[rec[j].ID] == 0 || mp[rec[j].ID] < i - P)
{
ans.push_back(rec[j]);
mp[rec[j].ID] = i;
cnt++;
if (cnt == k)
break;
}
}
}
for (int i = 0; i < ans.size(); i++)
cout << ans[i].name << " " << ans[i].ID << endl;
for (int i = 0; i < ans1.size(); i++)
cout << ans1[i].name << " " << ans1[i].ID << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cout << fixed;
cout.precision(18);
solve();
return 0;
}
到了這里,關(guān)于天梯賽 L2-034 口罩發(fā)放的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!