hihocoder----#1964 : 最大房租

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

小Hi有一个房间在AirBnb上出租,租金是每天100元。

现在他一共收到了N个预约,其中第i个预约的时间是第Si天到第Ei天。

显然预约必须被完整接受,不能只接受其中部分天数;并且小Hi不能接受有冲突(日期重叠)的预约。

请你帮小Hi计算他最多收到多少租金?

输入

第一行包含一个整数N。  

以下N行每行包含两个整数Si和Ei。  

1 <= N <= 100000 0 <= Si <= Ei <= 1000000

输出

一个整数代表答案

样例输入

5
1 3
4 6
7 9
3 101
4 100

样例输出

10000

我的思路:对输入数据a数组按照完成任务时间进行排序,然后将完成时间的数据保存在另一数组中(目的是为了方便后面的查记为找),然后对每一个当前的任务 i 的开始时间用lower_bound(lower_bound返回是升序排序好数组中第一个大于等于查找值的位置)查找在整个完成时间中(也就是代码中给出的b数组)的位置减1(记为 mid);若mid>=0,则ans=dp[mid]+a[i].y-a[i].x+1;否则,ans=a[i].y-a[i].x+1;dp[i]=max(ans,dp[i-1]);最后答案为dp[n-1]*100.具体通过代码参考:

#include
#include
#include
#include
using namespace std;
struct point{
	int x,y;
};
int n;
int dp[100010];
point a[100010];
int b[100010];
bool cmp(point u,point v){
	if(u.y=0) ans=dp[mid]+a[i].y-a[i].x+1;
		else ans=a[i].y-a[i].x+1;
		dp[i]=max(ans,dp[i-1]);
	}
	printf("%d00\n",dp[n-1]);
	return 0;
}

小弟不才,各位批评指正。

你可能感兴趣的:(hihocoder----#1964 : 最大房租)