1. 程式人生 > >容易的網路遊戲(離散)

容易的網路遊戲(離散)

現在網路遊戲一款接一款地推出,佳佳和他的同學們也迷上了網路遊戲。他們最近在玩N款不同的網路遊戲。
  一些網路遊戲允許玩家購買雙倍經驗卡。擁有雙倍經驗卡的玩家可以在有效期內獲得更多的經驗值。佳佳和他的同學們有著豐富的網遊經驗,對於任何一款網路遊戲,只要是在雙倍經驗的條件下,無論誰玩都可以在單位時間內輕鬆獲得一個單位的經驗值。
  國慶節馬上到了,網遊公司不會錯過這難得的機會大撈一把。中國網遊常用的賺錢手段便是免費提供雙倍經驗(因為如果玩家再買一張雙倍卡,便可獲得4倍經驗)。
  在9、10、11月份,佳佳和他的同學們玩的N個網路遊戲中每一個都會有一段開放免費雙倍經驗的時間。佳佳事先作了調查,他已經把每一款網遊的雙倍經驗開放時間都記了下來。佳佳是不會亂用自己的零花錢購買雙倍經驗卡的,他決定在免費雙倍經驗時叫同學到家裡一起玩;同時,他們也不會浪費自己的時間,為了提高效率,他們只玩處於免費雙倍經驗開放時期的遊戲。
  我們假定,每臺電腦最多隻能有一人操作,一個人最多隻能操作一臺電腦;並且每款遊戲最多隻能在一臺電腦上玩,每臺電腦最多執行一個遊戲。我們忽略開始遊戲和結束遊戲時所消耗的時間。
  現在佳佳想知道,假如佳佳共有M臺電腦,且佳佳一共叫來了P個同學,那麼他和他的同學們最多能得到多少單位的經驗呢?

Input

第一行有三個用空格隔開的整數N,M和P,它們表示的意義如題目描述。
  以下N行,每行有兩個用空格隔開的整數Xi,Yi(Xi<=Yi),表示從Xi單位時間到Yi單位時間為第i款遊戲開放雙倍經驗的時間。

對於70%資料,0<=Xi,Yi<=10000;
  對於100%資料,0<=Xi,Yi<=5000000,0<=P<=2147483647,1<=N<=1000,1<=M<=1000。

Output

一個整數,表示佳佳和他的同學們能獲得的最大經驗值。

Sample Input

1 1 1
0 100

Sample Output

101

 #include <iostream>
  #include <algorithm>
  using namespace std;
  long long a[100001][2],s[200001],n,m,p,t,tt,z;
  bool cmp (int a,int b)
  {
  	return a<b?true:false;
  }
  int main()
  {
  	cin>>n>>m>>p;
  	p++;//注意佳佳也是一個人!
  	for (int i=1;i<=n;i++)
  	{
  		cin>>a[i][0]>>a[i][1];
  		a[i][1]+=1;//包括最後一個點,所以要加1
  		s[i*2-1]=a[i][0];s[i*2]=a[i][1];
  	}
  	sort (s+1,s+(2*n)+1,cmp);
  	for (int i=1;i<2*n;i++)
  	{
  		t=p;tt=m;
  		for (int j=1;j<=n;j++)
  		{
  			if (s[i]>=a[j][0]&&s[i+1]<=a[j][1])
  			{
  				t--;
  				tt--;
  				z+=s[i+1]-s[i];
  			}
  			if (t==0||tt==0)//如果無人可以用或者無電腦就結束
  			break;
  		}
  	}
  	cout<<z;
  }