1 、 采矿( ( mining) )
【问题描述】
小奇飞船的钻头开启了无限耐久+精准采集模式!它想要将原矿运到泛光之
源的矿石交易市场,以便为飞船升级无限非概率引擎。
现在有 m+1 个星球,从左到右标号为 0 到 m,小奇最初在 0 号星球。
有 n 处矿体,第 i 处矿体有 ai 单位原矿,在第 bi 个星球上。
由于飞船使用的是老式的跳跃引擎,每次它只能从第 x 号星球移动到第 x+4
号星球或 x+7 号星球。每到一个星球,小奇会采走该星球上所有的原矿,求小奇
能采到的最大原矿数量。
注意,小奇不必最终到达 m 号星球。
【输入格式】
第一行 2 个整数 n,m。
接下来 n 行,每行 2 个整数 ai,bi。
【输出格式】
输出一行一个整数,表示要求的结果。
【样例输入】
3 13
100 4
10 7
1 11
【样例输出】
101
【样例解释】
第一次从 0 到 4,第二次从 4 到 11,总共采到 101 单位原矿。
【数据范 围】
对于 20%的数据 n=1,m<=10^5;
对于 40%的数据 n<=15,m<=10^5;
对于 60%的数据 m<=10^5;
对于 100%的数据 n<=10^5,m<=10^9,1<=ai<=10^4,1<=bi<=m。
[参考代码]
#include<bits/stdc++.h> using namespace std; struct oppo{ int s,x; }st[100005]; struct vivo{ int x,all; }hz; int MAX; deque< vivo > v; int n,m,ans; bool rule(oppo a,oppo b) { return a.x<b.x; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) scanf("%d %d",&st[i].s,&st[i].x); sort(st+1,st+n+1,rule); for(int i=1;i<=n;i++) { hz.x=st[i].x; hz.all=0; while(v.size()&&st[i].x-v[v.size()-1].x>17) { MAX=max(MAX,v[v.size()-1].all); v.pop_back(); } if(v.size()) { int op=0; while(op<v.size()) { if(st[i].x-v[op].x==0||st[i].x-v[op].x==4||st[i].x-v[op].x==7||st[i].x-v[op].x==8||st[i].x-v[op].x==11||st[i].x-v[op].x==12||st[i].x-v[op].x==14||st[i].x-v[op].x==15||st[i].x-v[op].x==16) hz.all=max(hz.all,v[op].all+st[i].s); op++; } } if(hz.x==0||hz.x==4||hz.x==7||hz.x==8||hz.x==11||hz.x==12||hz.x==14||hz.x==15||hz.x==16||hz.x>17) hz.all=max(hz.all,MAX+st[i].s); else hz.all=0; ans=max(ans,hz.all); v.push_front(hz); } cout<<ans<<endl; return 0; }