Sweety

Practice makes perfect

导航

Moving Tables

Posted on 2015-02-17 13:09  蓝空  阅读(280)  评论(0编辑  收藏  举报

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1050

经典的贪心算法

有两点要注意的

第一点:按照开始的时间排序,开始的时候用结束时间来排序,结果确实不对,有些数据通不过,例如:

4

10  30

15 50

60 70

40  80

所以需要用开始的时间排序

第二点:需注意题目的意思,贴图:

仔细观察图,注意1 3     4  6这两个是不能同时进行的,这样就可以吧奇数的调整到下面的一排中,开始的时候没有注意,WR了几次

好好读题。。。

#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct T{
	int start,end;
}a[210];

bool cmp(T a,T b){
	if(a.start!=b.start)
	 return a.start<b.start;
}
int main (){	
	int Case,temp;
	scanf("%d ",&Case);
	while(Case--){
	    int mark[210]={0};
        int n,sum=0;
        scanf("%d",&n);
	    for(int i=0;i<n;i++) {
		  	scanf("%d%d",&a[i].start,&a[i].end);
		   if(a[i].start>a[i].end)
		    temp=a[i].start,a[i].start=a[i].end,a[i].end=temp;
		   if(a[i].start%2==1)  a[i].start++;
		   if(a[i].end%2==1)  a[i].end++;
	   	}
	   sort(a,a+n,cmp);	
	   int j=n; 
	   while(n>0){
	       int last=-1;
	       for(int i=0;i<j;i++)
            	if(a[i].start>last&&mark[i]==0)
				  mark[i]=1,n--,last=a[i].end;   
		   sum++;
		 }
	     printf("%d\n",sum*10);
	}
	return 0;
}