7-3 口罩發放 (14分)
為了抗擊來勢洶洶的 COVID19 新型冠狀病毒,全國各地均啟動了各項措施控制疫情發展,其中一個重要的環節是口罩的發放。
某市出于給市民發放口罩的需要,推出了一款小程式讓市民填寫資訊,方便作業的開展。小程式收集了各種資訊,包括市民的姓名、身份證、身體情況、提交時間等,但因為資料量太大,需要根據一定規則進行篩選和處理,請你撰寫程式,按照給定規則輸出口罩的寄送名單。
輸入格式:
輸入第一行是兩個正整數 D 和 P(1≤D,P≤30),表示有 D 天的資料,市民兩次獲得口罩的時間至少需要間隔 P 天。
接下來 D 塊資料,每塊給出一天的申請資訊。第 i 塊資料(i=1,?,D)的第一行是兩個整數 T?i
和 S?i(1≤T?i,Si≤1000),表示在第 i 天有 Ti條申請,總共有 Si個口罩發放名額。隨后 Ti行,每行給出一條申請資訊,格式如下:
姓名 身份證號 身體情況 提交時間
給定資料約束如下:
姓名 是一個長度不超過 10 的不包含空格的非空字串;
身份證號 是一個長度不超過 20 的非空字串;
身體情況 是 0 或者 1,0 表示自覺良好,1 表示有相關癥狀;
提交時間 是 hh:mm,為24小時時間(由 00:00 到 23:59。例如 09:08。)。注意,給定的記錄的提交時間不一定有序;
身份證號 各不相同,同一個身份證號被認為是同一個人,資料保證同一個身份證號姓名是相同的。
能發放口罩的記錄要求如下:
身份證號 必須是 18 位的數字(可以包含前導0);
同一個身份證號若在第 i 天申請成功,則接下來的 P 天不能再次申請。也就是說,若第 i 天申請成功,則等到第 i+P+1 天才能再次申請;
在上面兩條都符合的情況下,按照提交時間的先后順序發放,直至全部記錄處理完畢或 S?i個名額用完。如果提交時間相同,則按照在串列中出現的先后順序決定。
輸出格式:
對于每一天的申請記錄,每行輸出一位得到口罩的人的姓名及身份證號,用一個空格隔開。順序按照發放順序確定。
在輸出完發放記錄后,你還需要輸出有合法記錄的、身體狀況為 1 的申請人的姓名及身份證號,用空格隔開。順序按照申請記錄中出現的順序確定,同一個人只需要輸出一次。
輸入樣例:
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
樣例解釋:
輸出中,第一行到第三行是第一天的部分;第四、五行是第二天的部分;第三天沒有符合要求的市民;第六行是第四天的部分。最后兩行按照出現順序輸出了可能存在身體不適的人員。
作者
DAI, Longao
單位
杭州百騰教育科技有限公司
代碼長度限制
16 KB
時間限制
400 ms
記憶體限制
64 MB
-------------------------------------------------------------
我寫了這么點,肝不動了 好像陷入了死胡同 求大佬幫看一下
#include<stdio.h>
#include<string.h>
struct people //每條申請的內容結構體
{
char name[11];
char id[20];
int health;
char time[6]; //**:**格式的時間用一個字串time代替,在轉為總分鐘t
int hh,mm;
int t;
int p; //p用來標記是否收到口罩,收到后變為P,表示再過P天才能收到口罩
};
struct day //每天內容的結構體包含天數D 間隔天數P 以及申請(people型結構體)構成的陣列
{
int T;
int S; //T為申請數,S為口罩數
struct people a[1000];
};
struct people change(struct people s) //此函式有輸入與求t(people型結構體中的總分鐘)的功能;
{
scanf("%s %s %d %s",&s.name,&s.id,&s.health,&s.time);
s.hh=(s.time[0]-'0')*10+s.time[1]-'0';
s.mm=(s.time[3]-'0')*10+s.time[4]-'0';
s.t=s.hh*60+s.mm;
return s;
}
struct day oneday(int i,struct day *pa) //第i天的申請與口罩數輸入
{
scanf("%d %d",&((pa+i)->T),&((pa+i)->S));
for(int j=0;j<(pa+i)->T;j++)
(pa+i)->a[j]=change((pa+i)->a[j]);
return *(pa+i);
}
struct day handle(int c,struct day pb[]) //對每天的資料按時間排序
{
struct people t,k;
int i,j;
for(i=0;i<pb[c].T-1;i++)
for(j=0;j<pb[c].T-i-1;j++)
if(pb[c].a[j].t>pb[c].a[j+1].t)
{
t=pb[c].a[j+1];
pb[c].a[j+1]=pb[c].a[j];
pb[c].a[j]=t;
}
return pb[c];
}
int D,P; //總天數D,與間隔天數P 全域變數
int main()
{
struct day d[10] ;
scanf("%d %d",&D,&P);
int i,j,t; //回圈用碼,記數碼
for(i=0;i<D;i++)
d[i]=oneday(i,d);
// for(i=0;i<D;i++) //檢驗陳述句
// {for(j=0;j<d[i].T;j++) //.....
// printf("%s",d[i].a[j].name); //......
// printf("\n"); //.....
// } //檢驗陳述句 以完成輸入共D天,每天T條申請,申請中包含people資訊
//處理分發口罩;
for(i=0;i<D;i++)
d[i]=handle(i,d); //對D天的資料排序
// for(i=0;i<D;i++) //檢驗陳述句
// {for(j=0;j<d[i].T;j++)
// printf("%s %d ",d[i].a[j].name,d[i].a[j].t);
// printf("\n");} //查看排序結果是否正確
//選擇輸出
for(i=0;i<D;i++)
{ t=(d[i].T<d[i].S)?(d[i].T):(d[i].S);
for(j=0;j<t;j++)
if(d[i].a[j].p==0)
{printf("%s %s\n",d[i].a[j].name,d[i].a[j].id);
d[i].a[j].p=P;
}
} //輸出答案有問題
for(i=0;i<D;i++) //輸出可能患病的人員
for(j=0;j<d[i].T;j++)
if(d[i].a[j].health==1)
printf("%s %s\n",d[i].a[j].name,d[i].a[j].id);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/229575.html
標籤:C語言
下一篇:報錯
