zoj3627 Treasure Hunt II 贪心+模拟

2024-06-14 09:18

本文主要是介绍zoj3627 Treasure Hunt II 贪心+模拟,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:n个城市在一条直线,相邻城市距离为1,每个城市都有一些宝藏。他们从p城市出发,有两个限制:1.他们只能在T时间内寻宝

2.他们两人的距离不能超过M,问他俩最多能获得的宝藏值。

思路:首先一开始他俩一定按相反方向跑,直至相距M(如果T小到无法形成M,直接输出T时间两人能走到的最左端到能走到的最右段

的宝藏和),如果M为奇数,那么你要分是左边的人向左,还是右边的人向右。接下来分两种情况,(1)先向左后向右  (2)先向右后向左

分别枚举一开始向左、向右走的天数,最后对所有情况球个最大值即可。相见代码:

// file name: A.cpp //
// author: kereo //
// create time:  2014年08月26日 星期二 12时16分24秒 //
//***********************************//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=100000+100;
const int inf=0x3fffffff;
#define L(x) (x<<1)
#define R(x) (x<<1|1)
int n,p,m,T;
int a[MAXN];
ll sum[MAXN];
int main()
{while(~scanf("%d%d",&n,&p)){sum[0]=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);sum[i]=sum[i-1]+a[i];}scanf("%d%d",&m,&T);int x=m/2;x=min(x,T);int l,r;l=max(1,p-x);r=min(n,p+x);int d=max(r-p,p-l);ll ans;if(T<=x){ans=sum[r]-sum[l-1];cout<<ans<<endl;continue;}int flag1=0,flag2=0;if(l>1)flag1=1;if(r<n)flag2=1;//向左扩1ans=sum[r]-sum[l-1];if(flag1){int L=l-1,R=r;if(m%2 == 0)L=l;ans=max(ans,sum[R]-sum[L-1]);int t=T-d-1; //剩余时间if(m%2 ==0)t+=1;for(int i=1;i<=min(L-1,t);i++){ll res=sum[L-1]-sum[L-i-1];int t1=t-i;int Rr=min(L-i+m+t1,n);res+=max((ll)0,sum[Rr]-sum[R]);ans=max(ans,res+sum[R]-sum[L-1]);}for(int i=1;i<=min(t,n-R);i++){ll res=sum[R+i]-sum[R];int t1=t-i;int Ll=max(1,R+i-m-t1);res+=max((ll)0,sum[L-1]-sum[Ll-1]);ans=max(ans,res+sum[R]-sum[L-1]);}}//向右扩1if(flag2){int L=l,R=r+1;int t=T-d-1;if(m%2 == 0)R=r,t+=1;ans=max(ans,sum[R]-sum[L-1]);for(int i=1;i<=min(L-1,t);i++){ll res=sum[L-1]-sum[L-i-1];int t1=t-i;int Rr=min(L-i+m+t1,n);res+=max((ll)0,sum[Rr]-sum[R]);ans=max(ans,res+sum[R]-sum[L-1]);}for(int i=1;i<=min(t,n-R);i++){ll res=sum[R+i]-sum[R];int t1=t-i;int Ll=max(1,R+i-m-t1);res+=max((ll)0,sum[L-1]-sum[Ll-1]);ans=max(ans,res+sum[R]-sum[L-1]);}}cout<<ans<<endl;}return 0;
}

这篇关于zoj3627 Treasure Hunt II 贪心+模拟的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059993

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

从0到1,AI我来了- (7)AI应用-ComfyUI-II(进阶)

上篇comfyUI 入门 ,了解了TA是个啥,这篇,我们通过ComfyUI 及其相关Lora 模型,生成一些更惊艳的图片。这篇主要了解这些内容:         1、哪里获取模型?         2、实践如何画一个美女?         3、附录:               1)相关SD(稳定扩散模型的组成部分)               2)模型放置目录(重要)

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点