JZOJ6401【NOIP2019模拟11.01】Time

Time

题目描述:
小 A 现在有一个长度为 𝑛 的序列 {𝑥𝑖},但是小 A 认为这个序列不够优美。
小 A 认为一个序列是优美的,当且仅当存在 𝑘 ∈ [1, 𝑛],满足:
𝑥1 ≤ 𝑥2 ≤ … ≤ 𝑥𝑘 ≥ 𝑥𝑘+1 ≥ … ≥ 𝑥𝑛
现在小 A 可以进行若干次操作,每次可以交换序列中相邻的两个项,现在他想知道最少操作多少次之后能够使序列变为优美的。

输入:
第一行一个正整数 𝑛,表示序列的长度。
接下来一行 𝑛 个整数,表示初始的序列。

输出:
输出一行一个整数,表示最少需要的操作次数。

这道题看起来比较简单,但是怎么看都感觉不对。
一开始的想法是找一个点分两段分别让它们满足题目要求。
后来发现这有问题,而且自己不会(我太弱了

对于这个方法的Hack数据:
20
3 4 10 9 8 8 7 1 6 5 5 5 5 5 5 5 5 5 5 5

答案是7。貌似错误方法会输出12。

然后突然猛然发现:我们可以对于每一个点,考虑它移向左边或者移向右边。
这样不就好了吗?点之间由于大小是没有影响的,反正改排你前面的就排你前面,排后面的就排后面。

可是突然感觉这样子做好像出现重复的数就会挂。手玩了几个数据发现没什么问题,就交了。但是感觉还是不妥。

估了60pts,实际上有100。

#include <cstdio>
#include <cstring>
using namespace std;

const int N = 100010;

inline int min(int a,int b) {
    return a < b ? a : b; }

inline void read(int &x)
{
   
    char ch = getchar(); x = 0;
    for(;ch < '0' || ch > '9';) ch = getchar
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值