2018 FJUT ACM校赛L题 外传:魔王打工记(三)

外传:魔王打工记(三)

TimeLimit:1000MS  MemoryLimit:128MB

64-bit integer IO format:%lld

Problem Description

靠着小明的朝五晚九地经营共享单车,魔王堡的总算熬过了这一个月。但是好景不长,共享单车市场竞争的太激烈,小明的公司已经开始亏损了,再这么下去吃枣药丸。

统计局的工资可能都不够亏的。为保住自己裤衩不被当掉,Home_W正苦苦思索着策略,这时网上突然出现了阿里巴巴用区块链养猪的新闻,Home_W看到现在农业这么火,灵机一动,决定辞掉统计局的工作,回农村种地,用大数据分析和人工智能搞生态农业。

现在Home_W要下乡种地n天,每天他都可以从地中收获到a[i]的蔬菜。同时第i天蔬菜的价格为b[i]。

Home_W 有一个发大财的心,所以他可能不会立即卖掉刚收获上来的蔬菜,而是会屯几天的菜,等到价格高了再一次性清仓全部卖掉。

但是每单位蔬菜每屯一天要花费1的电费用于制冷,比如,若单位电费为1,第1、2、3天得到蔬菜分别是3,2,1 那么把这些蔬菜屯到第4天再卖,要花费3*3+2*2+1*1=14电费。我们伟大Home_W 大魔王用大数据技术和魔力的组合完美预测出了这n天中,每天他能收获的蔬菜数量和蔬菜每天的价格。于是他采

取了最优策策略来卖菜,那么n天结束后他最多能赚到多少钱?

Input

单组数据,第一行是一个整数n代表天数

接下来一行 有n个数字  a1,a2,a3……an  代表每天收获上来的蔬菜的数量

再接下一行 有n个数 字 b1,b2,b3……bn  代表蔬菜每天的价格

1<=n<=5*105

0<ai,bi<=105

Output

输出一个整数,代表如果采取最优策略来卖菜,那么n天结束后Home_W最多能赚到钱的数量.

注意卖的时候必须卖光,不能留任何蔬菜

SampleInput

8
7 9 8 3 5 5 6 9
4 9 4 3 3 7 4 5 

SampleOutput

318
hint:分别在第二天,第六天,第八天卖出所有的蔬菜

/**
思路:
因为最后一天肯定是得卖出的,所以以最后一天为
最后一个状态,往前面推。假设最后一天的价值为
cost【n-1】,那么前一个状态对应的价值就会有两个
一个是cost【n-2】,一个是cost【n-1】-1;从两个状态
中我们当然是要选择大的那个。如果说cost【n-2】大于cost【n-1】-1;
那么我们肯定得选择在这一天卖出,不能存到cost【n-1】再卖出。
然后每次卖出就改变比较的值,往前面比较。你可能会问为什么要改变。
因为cost【n-2】的状态肯定大于cost【n-1】-1,那么再往前推一步,
cost【n-2】-1肯定大于cost【n-1】-2;所以保留cost【n-2】去与
cost【n-3】进行比较就可以了。
我们可以先标记在哪一天卖出,最后进行一次O(n)的计算就可以得出答案了。
**/

附上代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int MAXN = 5*1e5+5;
ll gas[MAXN];
ll cost[MAXN];
int flag[MAXN];
/**
思路:
因为最后一天肯定是得卖出的,所以以最后一天为
最后一个状态,往前面推。假设最后一天的价值为
cost【n-1】,那么前一个状态对应的价值就会有两个
一个是cost【n-2】,一个是cost【n-1】-1;从两个状态
中我们当然是要选择大的那个。如果说cost【n-2】大于cost【n-1】-1;
那么我们肯定得选择在这一天卖出,不能存到cost【n-1】再卖出。
然后每次卖出就改变比较的值,往前面比较。你可能会问为什么要改变。
因为cost【n-2】的状态肯定大于cost【n-1】-1,那么再往前推一步,
cost【n-2】-1肯定大于cost【n-1】-2;所以保留cost【n-2】去与
cost【n-3】进行比较就可以了。
我们可以先标记在哪一天卖出,最后进行一次O(n)的计算就可以得出答案了。
**/
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(gas,0,sizeof(gas));
        memset(cost,0,sizeof(cost));
        memset(flag,0,sizeof(flag));
        for(int i=0; i<n; i++)
            scanf("%lld",&gas[i]);
        for(int i=0; i<n; i++)
            scanf("%lld",&cost[i]);
        flag[n-1]=1;///初始标记,最后一天肯定卖出
        int ans=cost[n-1];///转移的价格
        for(int i=n-2;i!=-1;i--)
        {
            if(ans-1>cost[i])
            {
                ans--;///如果价值依旧大,那么往前接着转移
            }
            else
            {
                ans=cost[i];///如果价值小的话,进行改变转移值
                flag[i]=1;///标记卖出,再往前转移
            }
        }
        ll sum,num;
        sum=0;
        num=0;
        for(int i=0;i<n;i++)///计算答案
        {
           if(flag[i])
           {
               sum+=(num+gas[i])*cost[i];
               num=0;
           }
           else
           {
               num+=gas[i];
               sum-=num;
           }
        }
        printf("%lld\n",sum);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/qq136155330/p/9053999.html

时间: 2024-11-08 03:00:17

2018 FJUT ACM校赛L题 外传:魔王打工记(三)的相关文章

2018 FJUT ACM 校赛 j题 外传:魔王打工记(一)

外传:魔王打工记(一) TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description 话说Home_W大魔王手下有四大天王: 首席战神--赛文斯,SoftWork首席科学家--布莱克,首席军师--金金金,首席狙击手--超无聊,首席苦力--小明. 然而,这些部下个个都是饭桶,把Home_W都快吃穷.虽然Home_W嘴上说:打工是不可能打工的,这辈子不可能打工的.烧杀抢又不会做,就只有当正义

2018 FJUT acm校赛 b题 第二集:以后我就叫你小蛤了

第二集:以后我就叫你小蛤了 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description "小蛤啊,对了以后我就叫你小蛤了,你给的题完全没有难度啊" "哼,你别得意,让你碰巧做出来了而已,接下来这题你绝对不可能做出来的,你要是做出来了balabalabala...." "行了行了,快说题目吧,我时间宝贵啊!" 小A心急如焚,想尽快知道小C

第九届西电ACM校赛解答

Description 欢迎参加西电第九届ACM校内赛!作为一名经历了四届校赛的ACM老队员以及本次校赛的出题人,每次校赛都让我有一种全新的感受--有第一次参加校赛时提交代码时紧张到双手发抖,也有当裁判时看到有些不明真相的人提交编译后程序时的欢乐.不管你是第几次参赛,好好享受这一刻带给你的各种感受,经历就是一种财富.为了让大家更好地记住这悲喜交加的日子,特意准备了这么一道题: 给你一个日期,你只要输出这个日期是在校赛前还是校赛后,或者刚好就是校赛那一天(2011年5月22号). 题目是什么意思呢

2016 年宁波工程学院第七届ACM校赛题解报告

2016 年宁波工程学院第七届ACM校赛题解报告 本题解代码直接为比赛代码,仅供参考. A,B,C,D,G,H,J,K,L,M 来自 Ticsmtc 同学. F 来自 Gealo 同学. E,I 来自Alex 学长. Promblem A :    Two Sum 时间限制: 1 Sec  内存限制: 64 MB 题目描述: 给出n个数,另外给出?个整数S,判断是否可以从中取出2个数,使得这两个数的和是S. 输入: 第?行有个整数T(1 <= T <= 10),代表数据组数. 对于每组数据,第

第十届山东省acm省赛补题(2)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4124 L Median Time Limit: 1 Second      Memory Limit: 65536 KB Recall the definition of the median of  elements where  is odd: sort these elements and the median is the -th largest element.

sdut 2603 Rescue The Princess(算是解析几何吧)(山东省第四届ACM省赛A题)

题目地址:sdut 2603 Rescue The Princess Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Several days ago, a beast caught a beautiful princess and the princess was put in prison. To rescue the princess, a prince who wanted to marry the princess

CSU 1425 NUDT校赛 I题 Prime Summation

这个题本来有希望在比赛里面出了的 当时也想着用递推 因为后面的数明显是由前面的推过来的 但是在计算的时候 因为判重的问题 ...很无语.我打算用一个tot[i]来存i的总种树,tot[i]+=tot[j]//j为可以由j推到i的一系列数,但这样是不对的,会产生大量重复计算... 看了下标程才发现要用二维来计算出种类总数,f[i][j]+=sum(f[i-j][k]) 表示在推i数的时候,第一个素数为j的种类数,注意j一定为素数,而且k不能大于j...标程里面处理的比较简练,就学了下他的写法. 至

Sdut 2416 Fruit Ninja II(山东省第三届ACM省赛 J 题)(解析几何)

Time Limit: 5000MS Memory limit: 65536K 题目描写叙述 Haveyou ever played a popular game named "Fruit Ninja"? Fruit Ninja (known as Fruit Ninja HD on the iPad and Fruit Ninja THD for NvidiaTegra 2 based Android devices) is a video game developed by Hal

第5届ACM校赛—矩阵

矩阵 题目描述 给定一个n x m 的矩阵,每次操作,你可以对矩阵的某一个元素加上或减去一个整数值d,求最小的操作次数,使得矩阵的所有元素都相同,如果不能实现,输出-1. 输入 输入包含多组测试数据,对于每组测试数据: 第一行为三个整数  , m≤500,1≤d≤10000). 接下来 m 个整数,第 行第 个整数为ij(1  ij≤10). 当n=m=d=0 时代表输入结束. 输出 对于每组测试数据,输出一个整数,为最小操作次数,如果不能实现,输出-1. 64-bit,用long long 定