我不想寫背景
題目描述
某巨魔去滑雪(沒滑雪板),但他的技術並不精湛,在滑雪場裏,每天會提供
第
上完第
巨魔買了一張地圖,地圖上顯示了
巨魔的能力必須大於等於這個等級,以使得他能夠安全滑下。
巨魔可以用他的時間來滑雪,上課,或者在旁邊菊花叢中練習箭法,但是他必須在
這意味着他必須在
求巨魔在時間內最多可以完成多少次滑雪。
這一天開始的時候,他的滑雪能力爲
輸入格式
第一行
接下來
接下來
輸出格式
一個整數,表示巨魔滑雪的最大次數。
樣例輸入
10 1 2
3 2 5
4 1
1 3
樣例輸出
6
樣例解釋
0時刻,選擇在第1個斜坡上滑雪,時間花費3。
3時刻,選擇上第1節課。滑雪技術提高到5,時間花費2。
5時刻,選擇在第2個斜坡上滑雪,時間花費1。
6時刻,選擇在第2個斜坡上滑雪,時間花費1。
7時刻,選擇在第2個斜坡上滑雪,時間花費1。
8時刻,選擇在第2個斜坡上滑雪,時間花費1。
9時刻,選擇在第2個斜坡上滑雪,時間花費1。
10時刻,收隊了。
總滑雪次數:6
數據範圍
Solution
設
轉移方程就很容易推了。
Code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
int oo=(2147483647);
struct answer{
int i,j,k;
answer(int a,int b,int c){
i=a;
j=b;
k=c;
}
bool operator > (const answer num)const{
if(i!=num.i)return i>num.i;
if(j!=num.j)return j>num.j;
if(k!=num.k)return k>num.k;
}
};
struct object{
int l,t,v;
object(){
l=t=v=oo;
}
};
struct snow{
int c,d;
snow(){
c=d=oo;
}
};
inline int Max(int a,int b){
return a>b?a:b;
}
inline int in(){
char ch;
int x=0,flag=1;
ch=getchar();
while((ch>'9'||ch<'0')&&ch!='-')ch=getchar();
if(ch=='-'){flag=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x;
}
int t,s,n,rn,ans;
int maxn;
object o[10010];
snow w[10010];
priority_queue<answer,vector<answer>,greater<answer> >S;
bool cmp(object a,object b){
return a.l<b.l;
}
bool cmp2(snow a,snow b){
return a.c<b.c;
}
void prework(){
scanf("%d%d%d",&t,&s,&n);
rn=n;
for(int i=1;i<=s;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(x+y<=t){
o[i].l=x;
o[i].t=y;
o[i].v=z;
maxn=Max(maxn,o[i].v);
}
else
o[i].l=oo;
}
for(int i=1;i<=n;i++){
scanf("%d%d",&w[i].c,&w[i].d);
if(w[i].c>maxn){w[i].c=oo;rn--;}
}
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)if(w[j].c!=oo&&w[i].c!=oo){
if(w[i].c<=w[j].c&&w[i].d<=w[j].d){w[j].c=oo;rn--;}
if(w[i].c>=w[j].c&&w[i].d>=w[j].d){w[i].c=oo;rn--;}
}
for(int i=0;i<=t;i++)
S.push(answer(i,1,0));
sort(o+1,o+s+1,cmp);
sort(w+1,w+n+1,cmp2);
}
void mainwork(){
int now=1;
while(!S.empty()){
answer nos=S.top();
S.pop();
while(!S.empty()&&nos.i==(S.top()).i&&nos.j==(S.top()).j){
nos.k=(S.top()).k;
S.pop();
}
while(o[now].l==nos.i){
if(o[now].v>nos.j)
S.push(answer(nos.i+o[now].t,o[now].v,nos.k));
now++;
}
for(int k=1;k<=rn;k++){
if(w[k].c>nos.j)break;
if(nos.i+w[k].d<=t)
S.push(answer(nos.i+w[k].d,nos.j,nos.k+1));
}
if(ans<nos.k)ans=nos.k;
}
}
void endwork(){
printf("%d",ans);
}
int main(){
freopen("wtf.in","r",stdin);
freopen("wtf.out","w",stdout);
prework();
mainwork();
endwork();
return 0;
}