[1.30] T3-游戏

题目大意

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

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

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

题目解析

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

p o s pos pos n n n w = a [ p o s ] . n u m w=a[pos].num w=a[pos].num

从后往前找,遇到第一个比 w w w大的数,就 a n s + = w ∗ ( p o s − i ) ; ans+=w*(pos-i); ans+=w(posi);,并将 p o s pos pos赋为 i i i, w = a [ p o s ] . n u m w=a[pos].num w=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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值