• zoj 3632 Watermelon Full of Water


    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4778

    题目大意:

    暑假有n(1~50000)天,第i天西瓜的价格是p[i],可以吃d[i]天,如果在第i天买了个西瓜,那么旧的西瓜要扔掉,开始吃新西瓜。

    问每天都能吃到西瓜的最小花费。

    题目思路:

    p[i]表示第i天买喜欢的花费,d[i]表示第i天买的西瓜能吃的天数。

    dp[i],表示以i为起点,最少要花费多少钱才能使i~n每天都有西瓜吃。

    状态转移很显然dp[i]= (i+d[i]>n)? p[i] : min{dp[i+1]~dp[i+d[i]]}+p[i]

    很明显在取dp[i+1]~dp[i+d[i]]的过程显然不可以从i+1 ~ i+d[i]扫一遍,这样复杂度O(n*n),会超时。

    所以最直接的方法就是用线段树优化

    代码:

    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <math.h>
    #include <stack>
    #include <queue>
    #include <map>
    #include <set>
    #include <vector>
    #include <string>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    #define ll long long
    #define ls rt<<1
    #define rs ls|1
    #define lson l,mid,ls
    #define rson mid+1,r,rs
    #define middle (l+r)>>1
    #define clr_all(x,c) memset(x,c,sizeof(x))
    #define clr(x,c,n) memset(x,c,sizeof(x[0])*(n+1))
    #define eps (1e-8)
    #define MOD 1000000007
    #define INF 0x3f3f3f3f
    #define PI (acos(-1.0))
    #pragma comment(linker, "/STACK:102400000,102400000")
    template <class T> T _max(T x,T y){return x>y? x:y;}
    template <class T> T _min(T x,T y){return x<y? x:y;}
    template <class T> T _abs(T x){return (x < 0)? -x:x;}
    template <class T> T _mod(T x,T y){return (x > 0)? x%y:((x%y)+y)%y;}
    template <class T> void _swap(T &x,T &y){T t=x;x=y;y=t;}
    template <class T> void getmax(T& x,T y){x=(y > x)? y:x;}
    template <class T> void getmin(T& x,T y){x=(x<0 || y<x)? y:x;}
    int TS,cas=1;
    const int M=50000+5;
    ll n,p[M],d[M],mmin[M<<2],MAX;
    void build(int l,int r,int rt){
    	mmin[rt]=MAX;
    	if(l==r) return;
    	int mid=middle;
    	build(lson),build(rson);
    }
    void pushUp(int rt){
    	mmin[rt]=_min(mmin[ls],mmin[rs]);
    }
    void update(int l,int r,int rt,int p,ll c){
    	if(l==r){mmin[rt]=c;return;}
    	int mid=middle;
    	if(p<=mid) update(lson,p,c);
    	else update(rson,p,c);
    	pushUp(rt);
    }
    ll query(int l,int r,int rt,int L,int R){
    	if(L<=l && r<=R) return mmin[rt];
    	int mid=middle;
    	if(R<=mid) return query(lson,L,R);
    	else if(mid<L) return query(rson,L,R);
    	else return _min(query(lson,L,mid),query(rson,mid+1,R));
    }
    
    void run(){
    	int i,j;
    	MAX=1;
    	for(i=1;i<=n;i++) scanf("%lld",&p[i]),MAX+=p[i];
    	for(i=1;i<=n;i++) scanf("%lld",&d[i]);
    	ll ret,tmp;
    	build(1,n,1);
    	for(i=n;i>=1;i--){
    		int l=i+1,r=i+d[i];
    		if(r>n) ret=p[i];
    		else ret=query(1,n,1,i+1,i+d[i])+p[i];
    		update(1,n,1,i,ret);
    	}
    	printf("%lld\n",ret);
    }
    
    void preSof(){
    }
    
    int main(){
        //freopen("input.txt","r",stdin);
        //freopen("output.txt","w",stdout);
        preSof();
        //run();
        while((~scanf("%d",&n))) run();
        //for(scanf("%d",&TS);cas<=TS;cas++) run();
        return 0;
    }
    


     

  • 相关阅读:
    一句话告诉你JQuery $(this)到底指的是什么,怎么用
    JavaScript学习历程和心得体验
    营销养号、封号、解封方法_微信公众号
    买二手房五大注意事项 这样买房才不吃亏
    Win10专业版下图片拖到PS无法打开的解决技巧
    远程服务器桌面登陆后黑屏或无法进行操作的解决办法
    monkey测试===什么是monkey测试(系列一)转
    monkey测试===Android测试工具Monkey用法简介(转载)
    monkey测试===monkeyrunner测试教程(2)
    monkey测试===monkeyrunner测试教程(1)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3026934.html
Copyright © 2020-2023  润新知