容易的網路遊戲(離散)
現在網路遊戲一款接一款地推出,佳佳和他的同學們也迷上了網路遊戲。他們最近在玩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; }