Money----思维+模拟

 

链接:https://ac.nowcoder.com/acm/contest/295/B

题目描述

White Cloud has built n stores numbered from 1 to n.
White Rabbit wants to visit these stores in the order from 1 to n.
The store numbered i has a price a[i] representing that White Rabbit can spend a[i] dollars to buy a product or sell a product to get a[i] dollars when it is in the i-th store.
The product is too heavy so that White Rabbit can only take one product at the same time.
White Rabbit wants to know the maximum profit after visiting all stores.
Also, White Rabbit wants to know the minimum number of transactions while geting the maximum profit.
Notice that White Rabbit has infinite money initially.

输入描述:

The first line contains an integer T(0<T<=5), denoting the number of test cases.
In each test case, there is one integer n(0<n<=100000) in the first line,denoting the number of stores.
For the next line, There are n integers in range [0,2147483648), denoting a[1..n].

输出描述:

For each test case, print a single line containing 2 integers, denoting the maximum profit and the minimum number of transactions.

输入

1
5
9 10 7 6 8

输出

3 4

题目大意:

有n个商店,编号从1到n。编号为 i 的商店有一个价格 a[ i ]。

小白兔想按从1到n的顺序参观这些商店。

每到一个商店,小白兔可以在这里花费a[ i ]美元购买一种产品,或者出售一种产品以获得a[i]美元。

白兔身上只能携带一种产品。

要求的是白兔参观完所有商店后的最大利润是多少。并且希望在获取最大利润的同时,交易的数量是最少的。

ps:白兔一开始有无限的钱。

解题思路:

我们的思路 就是

当我们手里没商品的时候  我们需要选择一个买入商品的地方 如何选呢?

先买下第一个商品 花费记为o  紧接着的第二个商品 如果说价格低于o  那么其实我们不应该买第一个的  应该从第二个开始买

所以这个时候我们做更新操作  o的值更新为第二个 以此类推 如果接下来的还比o小 我们继续更新(此操作是在纠正买东西的位置)

当我们手里有商品的时候  我们需要选择一个卖出商品的地方 如何选呢?

当我们第一次遇到大于o的值的时候  我们就卖掉商品 那么获利就是a[ i ] - o   交易次数累加2  然后我们把o更新为a[ i ]

接着走如果遇到的还大于o  那么说明我们刚才卖的早了  应该在这里卖  所以我们将获利 再累加上a[ i ] - o 但是不改变交易次数(这个操作是在纠正卖商品的地点    如何控制什么时候改变交易次数呢   就是看手中有商品没  手中有的时候  卖掉时 交易次数+2  然后就把flag置为0 代表手中没商品  接下来遇到a[ i ]再比o大 就只更新o 不改变次数 )

以上两种情况交替使用 遍历一遍就得到了最大利润 和 最小交易次数(什么叫交替使用?  身上没商品的时候  选择买商品的位置  选好了  就要选择卖商品的位置  卖完了 就要选择买商品的位置)

 

最后再注意一点  当a[ i ]==o的时候 我们不进行任何操作 跳过即可 因为不会获利(注意  也不要改变flag的状态)

 

代码

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
ll a[maxn];
int T,n;
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        //o代表当前手里买的商品的价格
        //cnt代表交易次数
        //flag为1代表当前手里买了商品 为0代表手里没商品
        ll o,cnt=0,sum=0,flag=1;
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            if(i==1){
                o=a[1];flag=1;
            }
            else{
                if(a[i]<o){
                    o=a[i];flag=1;
                }
                else if(a[i]>o){
                    if(flag==1){
                        sum+=a[i]-o;o=a[i];
                        cnt+=2;flag=0;
                    }
                    else{
                        sum+=a[i]-o;o=a[i];
                    }
                }
            }
        }
        printf("%lld %lld\n",sum,cnt);
    }
    return 0;
}

 

 

 

 

 

 

 

 

 

全部评论

相关推荐

03-13 00:04
已编辑
吉林大学 Java
约面的挺突然。。狠下心接了1.自我介绍2.讲讲JAVA的反射3.可以继续讲讲AOP,动态代理[&nbsp;因为讲反射不小心吟唱到了例如AOP的动态代理,但是这块记忆的非常不熟,结果磕磕绊绊&nbsp;]4.项目我看你写了AOP和注解,具体怎么实现滑动窗口限流的[&nbsp;梦到什么说什么,吟唱八股发散千万不要散到自己不熟悉的区域&nbsp;]5.也讲讲为什么另一个项目选择令牌桶,具体流程6.&nbsp;OK,讲讲&nbsp;Redis&nbsp;的数据类型?还有吗?就了解这五种嘛[&nbsp;把5个的基础类型从应用对比到历届底层全都吟唱了一遍。一句还有吗直接没力气了,简历就写了理解5种,别的我是真一点没看TT&nbsp;]7.讲讲Redission分布式锁实现8.这个指数退避怎么实现的9.在这里有考虑去保障幂等性嘛10.这里为什么使用指数退避呢?&nbsp;什么时候用均匀重传[已经晕过去了说不了解,刚说了后就意识到,估计应该说指数退避能缓解压力防止下游服务器雪崩之类的]11.ok,那讲讲JMM12.讲讲RocketMQ如何保证的不丢消息13.讲讲RocketMQ延迟消息原理14.讲讲项目Redis实现会话记忆这一块15.如果ai调用function&nbsp;calling出现幻觉,有考虑怎么解决吗?[&nbsp;不了解,面试官说什么接口幂等化,高危操作人工防护,没在听,感觉人已经飞升了TT&nbsp;]16.mcp了解嘛?和function&nbsp;calling有什么区别[&nbsp;依旧不了解,只能说了个前者规范架构抽象解耦,后者耦合高只能算个工具调用]17.AI生成代码的代码质量怎么保障,那平时如何review的呢18.算法。lc215&nbsp;&nbsp;数组中最大第k个元素19.打算考研还是本科就业20.反问1️⃣有哪里不足,有哪些需要提高的部分。[主要说知识广度不够,多刷算法,让我别太紧张]2️⃣部门业务会做什么人生第二次面试。感觉大厂面试官的气场压力很大应该凉了不过这次面试非常锻炼心态,多面试,多面试。
冰炸橙汁_不做oj版:redis除了五种基本数据类型,其他的几种还是要掌握一下的,挺常用
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务