首页 > ACM题库 > HDU-杭电 > HDU 1707 Spring-outing Decision[解题报告] C++
2013
12-21

HDU 1707 Spring-outing Decision[解题报告] C++

Spring-outing Decision

问题描述 :

Now is spring ! The sunshine is warm , the flowers is coming out . How lovely it is! So my classmates and I want to go out for a spring-outing.

But we all select courses ourselves. We don’t have classes at the same time.Now our monitor has a big trouble in arranging the time of the spring-outing.

Can you help him?

I will give you our courses information and the time of the spring-outing.You just need to tell me that who can’t go with us.

输入:

The first line contains an integer CA which indicates the number of test cases.
Then CA cases follow.
Each case contains two parts,the students’ courses information and the query.

In the first part ,first there is an integer N(N<200) which means the number of the student,and then comes the N students’ courses information.
A student’s courses information is in this format:

line1: name K
line2: day1 b1 e1
…..
lineK+1: dayK bK eK

The first line of a student’s courses infomation contains his name(less than 20 characters and in lowercase) and the number(K,K<1000) of his courses . Then next K lines describe his courses. Each Line contain three integers indicate the day of a week( 1 <= day <= 7 means Monday to Sunday ), the begin time and the end time of the course.
To make the problem easier,the begin time and the end time will be in the range from 1 to 11 .(Because in HDU,there is 11 classes one day).

In the query part , first there is an integer Q which means the query number,and then Q lines follow.
A query contains three integers which means the day ,the begin time and the end time of the spring-outing.And the time is described as the courses.
Notice,everyone may have more than one course at the same time for some special reasons.

输出:

For each query , just print the names of the students who can’t go out for a spring-outing in a line in lexicographic order.
Please separate two names with a blank.
If all of the students have time to go , just print "None" in a line.

样例输入:

1
3
linle 3
1 1 2
2 3 4
3 8 10
laili 1
4 1 4
xhd 2
1 2 4
4 5 6
3
1 2 2
4 4 5
5 1 2

样例输出:

linle xhd
laili xhd
None

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1707

思路:memset妙用,把当天的上课时间标记为true..然后查询的时候进行遍历就行了。

#include<iostream>
 #include<cstdio>
 #include<cstring>
 #include<algorithm>
 #include<cstdlib>
 using namespace std;
 #define MAXN 222
 struct Person{
     bool time[11][14];
     char name[22];
 }Per[MAXN];
 int n;
 
 int cmp(const void *a,const void *b){
     return (strcmp((char *)a,(char *)b));
 }
 
 int main(){
     int _case;
     scanf("%d",&_case);
     while(_case--){
         memset(Per,false,sizeof(Per));
         int n,k,d,s,e;
         scanf("%d",&n);
         for(int i=1;i<=n;i++){
             scanf("%s%d",Per[i].name,&k);
             while(k--){
                 scanf("%d%d%d",&d,&s,&e);
                 memset(Per[i].time[d]+s,true,(e-s+1)*sizeof(Per[i].time[0][0]));
             }
         }
         scanf("%d",&k);
         while(k--){
             scanf("%d%d%d",&d,&s,&e);
             char str[MAXN][22];
             int count=0;
             for(int i=1;i<=n;i++){
                 bool flag=true;
                 for(int j=s;j<=e;j++){
                     if(Per[i].time[d][j]){flag=false;break;}
                 }
                 if(!flag){strcpy(str[count++],Per[i].name);}
             }
             if(count==0){puts("None");continue;}
             qsort(str,count,sizeof(str[0]),cmp);
             for(int i=0;i<count-1;i++){
                 printf("%s ",str[i]);
             }
             printf("%s\n",str[count-1]);
         }
     }
     return 0;
 }

 

解题报告转自:http://www.cnblogs.com/wally/archive/2013/04/30/3052425.html


  1. 学算法中的数据结构学到一定程度会乐此不疲的,比如其中的2-3树,类似的红黑树,我甚至可以自己写个逻辑文件系统结构来。