[1.30] T3-游戏

题目大意

一个人可以往前跳,跳的距离可以是无限的,但必须最后跳到第n个点并不超过第n个点

如果他从 iii 跳到 jjj,那么他得到的a[j]∗(j−i)a[j]*(j-i)a[j](ji)的分数,其中a[j]a[j]a[j]jjj点上的分数(j>i)(j>i)(j>i)

原点没有分数,求他跳到第nnn个点最多能得到多少分

题目解析

这题有多种做法,这里给出贪心的做法

posposposnnnw=a[pos].numw=a[pos].numw=a[pos].num

从后往前找,遇到第一个比www大的数,就ans+=w∗(pos−i);ans+=w*(pos-i);ans+=w(posi);,并将pospospos赋为iii,w=a[pos].numw=a[pos].numw=a[pos].num

实际上可以用DP加上斜率优化

代码

#include<bits/stdc++.h>
#define L long long
using namespace std;
int n,pos,ans,w;
struct A
{
	int num,id;
}a[100005];
ifstream fin("game.in");
ofstream fout("game.out");
int main()
{
	fin>>n;
	for(int i=1;i<=n;i++)
	 fin>>a[i].num,a[i].id=i;
	a[0].num=2e9;
	for(int i=n;i>=0;i--)
	 if(a[i].num>w)
	 {
	   ans+=w*(pos-a[i].id);
	   w=a[i].num;
	   pos=i;
	 }
	fout<<ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值