uva 12018 Juice Extractor 谷歌杯程序设计大赛

题目链接:http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=19242      uva 12018 谷歌杯程序设计大赛

这个题目就是有关水果忍者的游戏的题目,就是每一个水果都有一个出现时间和一个消失时间,在某一次出现的水果可以一次性切掉,而一次切掉的水果数如果小于3则不得分,大于三时,就得到相应的分数(切掉几个得几分),切掉之后水果消失。问能得到的最大分数值。

uva 12018 uva 12018

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Fruit{
    int start,end;
};

Fruit fr[1010];
int n,dp[1010];
int ans;

int cmp(const void * a,const void * b){
	Fruit * f1=(Fruit *)a;
	Fruit * f2=(Fruit *)b;
	return f1->start-f2->start;
}

int max(int a,int b){
	return a>b?a:b;
}

void ISureIWillAc(){
	int i;
	ans=0;
	qsort(fr,n,sizeof(Fruit),cmp);
	
	memset(dp,0,sizeof(dp));
	for(i=2; i<n; i++){
		int score=0;
		if(i+1<n && fr[i].start==fr[i+1].start) continue;
		for(int j=i; j>=0; j--){
			if(fr[j].start<=fr[i].start && fr[j].end>=fr[i].start) score++;
			int may=score;
			if(may<3) may=0;
			if(j==0){
				dp[i]=max(dp[i],may);
			}else{
				dp[i]=max(dp[i],dp[j-1]+may);
			}
			ans=max(ans,dp[i]);
		}
	}
}

int main(){
    int t,i;
    scanf("%d",&t);
    for(int cas=1;cas<=t;cas++){
		printf("Case #%d: ",cas);
        scanf("%d",&n);
        for(i=0; i<n; i++){
            scanf("%d%d",&fr[i].start,&fr[i].end);
        }
		ISureIWillAc();
        printf("%d\n",ans);
    }
}


你可能感兴趣的:(uva 12018 Juice Extractor 谷歌杯程序设计大赛)