#C240130B. 刷野II


#C240130B. 刷野II

网址(Website)

题目详情 - 刷野II - Super

题解 - 刷野II - Super

题解(Solution)

策略:每次找目前还没有打过的且生命值最大的怪去打。

如果当前不去打生命值最大的怪,那么在魔力消耗后再去打就一定会消耗更多的魔力,因此找出每个点对于左边的的最大值和右边的最大值进行比较,先一路过去干掉生命值最大的一定更优。

代码(Code)

#include<bits/stdc++.h>
#include<deque>
#include<vector>
#define For(i,l,r) for(int i=l;i<=r;i++)
#define Rof(i,l,r) for(int i=l;i>=r;i--)
using namespace std;
#define P pair<int,int>
#define int long long
inline int input(){int x;return cin>>x,x;}
const int inf = 0x3f3f3f3f3f3f3f3f;
const int N = 5012345;
int n,maxx=0,st,tid,a[N];

int l[N],r[N];
vector<int> gr;
void Solve(){
	maxx=0;For(i,1,n) if(maxx<a[i]) maxx=a[i],st=i;
	maxx=0;For(i,1,st-1) maxx=max(maxx,a[i]),l[i]=maxx,maxx++;
	maxx=0;Rof(i,n,st+1) maxx=max(maxx,a[i]),r[i]=maxx,maxx++;
	{
		int ll=st-1,rr=st+1,sum=a[st],u=a[st]-1;
		gr.emplace_back(st);
		while(ll>0 || rr<=n){
			if(rr>n || l[ll]>=r[rr]){
				if(u>=l[ll]) u--;
				else sum+=(l[ll]-u),u=l[ll]-1;
				gr.emplace_back(ll),
				ll--;
			}else{
				if(u>=r[rr]) u--;
				else sum+=(r[rr]-u),u=r[rr]-1;
				gr.emplace_back(rr),
				rr++;
			}
		}cout<<sum<<'\n';
		for(auto x:gr) cout<<x<<' ';cout<<'\n';
	}
}

signed main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	string str("lightning");
	freopen((str+".in").c_str(),"r",stdin);
	freopen((str+".out").c_str(),"w",stdout);
	cin>>tid>>n;For(i,1,n) a[i]=input();
	int Tim=clock();
	Solve();
	return cerr<<"TIME:"<<(clock()-Tim)/1000.,0;
}

文章作者: WolfDeer
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 WolfDeer !
  目录