思路:标记课程表上的课程,询问时遍历课程表,再以字典序输出名字。
1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<memory.h> 5 #include<string.h> 6 #include<algorithm> 7 #include<cmath> 8 #include<stack> 9 const int MAXX= 50000; 10 const int mod=1e9+7; 11 using namespace std; 12 typedef long long ll; 13 int T; 14 int n; 15 int q; 16 int k; 17 struct info 18 { 19 bool data[8][12]; 20 char name[20]; 21 } per[200]; 22 23 struct pp 24 { 25 char ans[21]; 26 } w[210]; 27 28 bool cmp(pp a,pp b) 29 { 30 return strcmp(a.ans,b.ans)<0; 31 } 32 33 int main() 34 { 35 freopen("in.txt","r",stdin); 36 scanf("%d",&T); 37 while(T--) 38 { 39 scanf("%d",&n); 40 memset(per,0,sizeof(per)); 41 for(int i=1; i<=n; i++) 42 { 43 int d,b,e; 44 scanf("%s%d",per[i].name,&k); 45 for(int j=1; j<=k; j++) 46 { 47 scanf("%d%d%d",&d,&b,&e); 48 while(b<=e) 49 { 50 per[i].data[d][b]=1; 51 b++; 52 } 53 //memset(per[i].data[d]+b,1,(e-b+1)*sizeof(per[i].data[0][0])); 54 } 55 } 56 scanf("%d",&q); 57 while(q--) 58 { 59 int d,b,e; 60 scanf("%d%d%d",&d,&b,&e); 61 //char newname[200][22]; 62 int countt=0; 63 for(int i=1; i<=n; i++) 64 { 65 bool flag=1; 66 for(int j=b; j<=e; j++) 67 { 68 if(per[i].data[d][j]) 69 { 70 flag=0; 71 break; 72 } 73 } 74 if(!flag) 75 { 76 strcpy(w[countt].ans,per[i].name); 77 countt++; 78 } 79 } 80 if(countt==0) 81 { 82 cout<<"None"<<endl; 83 continue; 84 } 85 sort(w,w+countt,cmp); 86 for(int i=0; i<countt; i++) 87 { 88 if(i) 89 printf(" "); 90 printf("%s",w[i].ans); 91 } 92 //printf("%s ",newname[countt-1]); 93 printf(" "); 94 } 95 } 96 return 0; 97 }