ZOJ 3632 ----dp+优先队列

上个礼拜学长讲了优先队列的说....

emmmmmm....

看着题解敲了一题...先m下。

#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdio>
#include<queue>
using namespace std;
struct gua
{
	long long v,d;
	bool operator < (const gua &b)const
	{
		if(v==b.v) return d>b.d;
		return v>b.v;
	}
};//这里手残漏了个分号导致螺旋报错
priority_queue<gua>que;
int main()
{
	int a[50005],b[50005],n,i;
	long long p[50005]={0};//p[i]表示在前i天有西瓜吃的情况下(并非于i天截止)最小花费
	while(cin>>n)
	{
		for(i=1;i<=n;i++) cin>>a[i];
		for(i=1;i<=n;i++) cin>>b[i];
		while(que.size()) que.pop();//初始化队列
		gua t;
		for(i=1;i<=n;i++)
		{
			t.v=p[i-1]+a[i];
			t.d=i+b[i]-1;
			while(que.size()&&que.top().d<i) que.pop();//判断,当当前最优解的天数打不到i时弹出
			que.push(t);
			p[i]=que.top().v;
		}
		cout<<p[n]<<endl;
	}
}

  rua~

时间: 2024-10-08 14:25:56

ZOJ 3632 ----dp+优先队列的相关文章

ZOJ 3632 Watermelon Full of Water (线段树 区间更新 + dp)

题目大意: 让每天都能吃到西瓜.最少需要花多少钱. 思路分析: dp[pos] 就表示  要让 前i天每天都有西瓜吃,最少需要花多少钱. 那么如果你买这个西瓜的话.那么这个西瓜能吃的持续时间都要更新一下. 然后再在每个西瓜的更新部分取最小的,就可以是这个点所能得到的最小值. 其实就是 dp[i] = min (dp[i] , dp[ j - k +1] + a[j]); 但是枚举前面的时候会超时,就用线段树维护. 5 1 2 3 4 5 1 2 2 2 2 给出这组数据是说,每次买西瓜的时候,都

ZOJ 3632 Watermelon Full of Water(dp+线段树或单调队列优化)

Watermelon Full of Water Time Limit: 3 Seconds      Memory Limit: 65536 KB Watermelon is very popular in the hot summer. Students in ZJU-ICPC Team also love watermelon very much and they hope that they can have watermelon to eat every day during the

ZOJ 3632 Watermelon Full of Water(dp+线段树 单点修改)

题意: 一共有n天 每天西瓜售价为dp[i]元 该天的西瓜能吃v[i]天 而且这天如果买了西瓜之前的西瓜就要扔掉 问每天都吃到西瓜的最小花费是多少 思路: 从最后一天开始dp最小花费 并用线段树单点更新来维护 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; #define ll long long #def

HUNNU 11568 Interstellar Travel(DP+优先队列)

Interstellar Travel Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 2, Accepted users: 1 Problem 11568 : No special judgement Problem description   In A.D. 3014, scientists find that wormhole can be used for in

ZOJ 3865 Superbot(优先队列--模板)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5477 主要思路:1.从一个点(cur)到它相邻的点(next),所需要的时间数(t)其实是固定的,而且这个移动过程后,到达next时,相应的方向也是固定的,找到求t的办法就好了.    2.到达一个未到达的点可能有多条路,优先队列取时间最短的路,则答案最优 题目: Superbot Superbot is an interesting game which you

zoj 3735 dp+计算几何

题意:给定n个点的坐标,先问这些点是否能组成一个凸包,如果是凸包,问用不相交的线来切这个凸包使得凸包只由三角形组成,根据costi, j = |xi + xj| * |yi + yj| % p算切线的费用,问最少的切割费用. 链接:点我 题解:点我 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath>

POJ 3162 Walking Race 树形dp 优先队列

http://poj.org/problem?id=3162 题意 :  一棵n个节点的树.wc爱跑步,跑n天,第i天从第i个节点开始跑步,每次跑到距第i个节点最远的那个节点(产生了n个距离),现在要在这n个距离里取连续的若干天,使得这些天里最大距离和最小距离的差小于M,问怎么取使得天数最多? 每个点的最大距离和之前http://acm.hdu.edu.cn/showproblem.php?pid=2196这道题一样 (就是求每个子树的最长子链,次长子链,然后求经过父亲节点能达到的最大值,比较一

ZOJ - 2402 DP方案数

题意:给出m,序列第i位是第i-1位的至少2倍大,的求长度为n且每一位范围均在1-m的序列方案数 对求方案数做不到信手拈来的感觉,需要加强 用简单的预处理和最优子结构能优化到很不错的效率了 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<stri

ZOJ 3603 DP LCS

已经5年没有做OJ了, 曾经沧海难为水,除去巫山不是云" 准备每周刷1-2题! 题目大意:给出N个字符串,且各个字符串都包含唯一的字母,即不存在"ABCA"(A重复了),而"AFDSG"是正确的.                  求出N个字符串的公共字母. 最后,按照字典序输出. 分     析:首先对各个字符串进行字典序排序,然后求所有的LCS,做法是两两相求即可.N个字符串,总共求N-1次LCS,就得到最后的结果了. 代     码: //http: