2017年10月20日提高T3 编译优化

33 篇文章 0 订阅
14 篇文章 0 订阅

Description


这里写图片描述

Input


这里写图片描述

Output


这里写图片描述

Hint


这里写图片描述
这里写图片描述

Solution


可以撤销的贪心,妙啊

考试的时候没想到,思路很神奇。
贪心地做,用一个堆维护最大的点。由于不能连续地选,那么我们选了一个点i之后就删掉前面的点pre[i]和后面的点nex[i]。但是这样会错因为不一定是最优的,于是需要每次删点之后新建一个权值为v[pre[i]]+v[nex[i]]-v[i]的点,表示选了pre[i]和nex[i]而不选i,意味着只选i的操作是可以撤销的。这样每次一定多选一个点,选完m个一定是最优的

Code


#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <queue>
#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)
#define drp(i, st, ed) for (int i = st; i >= ed; i -= 1)
#define erg(i, st) for (int i = ls[st]; i; i = e[i].next)
#define fill(x, t) memset(x, t, sizeof(x))
#define max(x, y) ((x)>(y)?(x):(y))
#define min(x, y) ((x)<(y)?(x):(y))
#define abs(x) ((x)<(0)?(-(x)):(x))
#define N 202000
#define E 1001
#define L 1001
using std:: pair;
std:: priority_queue<pair <int, int> > heap;
int pre[N], nex[N], t[N];
bool vis[N];
inline int read() {
    int x = 0, v = 1; char ch = getchar();
    for(; ch<'0'||ch>'9'; v=(ch=='-')?(-1):(v),ch=getchar());
    for(; ch<='9'&&ch>='0'; (x*=10)+=ch-'0',ch=getchar());
    return x * v;
}
int main(void) {
    int n = read();
    int m = read();
    rep(i, 1, n) {
        t[i] = read();
        pre[i] = i - 1;
        nex[i] = i + 1;
        pair <int, int> p(t[i], i);
        heap.push(p);
    }
    pre[1] = n;
    nex[n] = 1;
    int ans = 0;
    rep(i, 1, m) {
        pair <int, int> top(heap.top());
        heap.pop();
        while (vis[top.second]) {
            top = heap.top();
            heap.pop();
            if (heap.empty()) {
                puts("Error!");
                return 0;
            }
        }
        ans += top.first;
        t[top.second] = t[pre[top.second]] + t[nex[top.second]] - t[top.second];
        vis[pre[top.second]] = vis[nex[top.second]] = 1;
        nex[pre[pre[top.second]]] = top.second;
        pre[top.second] = pre[pre[top.second]];
        pre[nex[nex[top.second]]] = top.second;
        nex[top.second] = nex[nex[top.second]];
        heap.push(std:: make_pair(t[top.second], top.second));
    }
    printf("%d\n", ans);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
九宫格键盘是一种在手机键盘上常见的布局方式,主要用于输入中文和其他一些特殊符号。九宫格键盘将26个字母和其他输入选项分布在一个3x3的方格中,每个方格有一个或多个字母。用户通过在方格内滑动手指来选择字母进行输入。上海计算机学会在202010份举办了一场名为“c”的赛,其中丙组的题目包括了九宫格键盘的应用。 九宫格键盘在手机输入中具有一定的优势。首先,九宫格键盘相对于传统的QWERTY键盘,可以减少单个按键的尺寸,提高了输入的精度。其次,九宫格键盘将字母进行分组排列,大大降低了输入频率较高的字母之间的距离,提高了输入速度。此外,九宫格键盘还提供了一些特殊符号、数字和常用词语的快捷输入功能,使得输入更加方便和快捷。 针对上海计算机学会202010赛c丙组t3九宫格键盘c这个题目,应该是要求参赛选手设计一个基于九宫格键盘的输入法或者其他相关的应用程序。具体的题目要求可能涉及到输入法的设计原理、算法优化、界面设计等方面。参赛选手需要运用自己在计算机学会学习和实践过程中所掌握的知识,结合九宫格键盘的特点和应用场景,设计出一个创新性、实用性强的解决方案。 九宫格键盘在手机输入领域具有广泛的应用前景。随着智能手机的普及和人们对于更高效便捷的输入方式的需求,九宫格键盘的市场需求也在不断增加。因此,对于计算机学会的学生来说,参与这样的竞赛活动,不仅可以提高自己的技术能力和解决问题的能力,同时也能够加深对于九宫格键盘以及相关领域的理解和应用。这对于学生们今后的学习和发展都将起到积极的促进作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值