UVALive - 4629 Knowledge for the masses 高效

题目大意:有一个人要找管理员,但前进的路上有很多的障碍

移动一个障碍到相应行的空位置需要花费1点体力,距离不限

问花费的最少体力值是多少,能前进的路是哪几条

解题思路:参考了学长的代码

求出每条前进道路的需要花费的最小体力值,再进行比较就可以

难点刚好就是这个了

vis[i]代表将该行的i列位置扫清需要消耗的体力值,flag[i]表示可以将第i列的几个位置扫清,如果i == R,就表示该列可以前行了,zero[i]表示该行第i个0所在的位置,cost[i]表示清每行第i列障碍的体力和

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 1000010
#define INF 0x3f3f3f3f
int cost[maxn], flag[maxn], zero[maxn], num[maxn], vis[maxn], ans[maxn];
int L, R;

void input() {
    int n;
    scanf("%d", &n);
    int pos = 0, cnt = 0;
    memset(vis, -1, sizeof(vis));
    for(int i = 0; i < n; i++) {
        scanf("%d", &num[i]);
        if(num[i] == 0) {
            flag[pos++]++;
            zero[cnt++] = i;
        }
        else {
            int t = min(cnt, num[i]);
            pos += num[i];
            for(int j = 1; j <= t; j++) {
                int u = pos - j;
                vis[u] = i - zero[cnt - j] - j + 1;
                cost[u] += vis[u];
                flag[u]++;
            }
        }
    }
    reverse(num, num + n);
    cnt = 0;

    for(int i = 0; i < n; i++) {
        if(num[i] == 0) {
            zero[cnt++] = i;
            pos--;
        }
        else  {
            int t = min(cnt, num[i]);
            pos -= num[i];
            for(int j = 0; j < t; j++) {
                int u = pos + j;
                if(vis[u] == -1) {
                    vis[u] = i - zero[cnt - j - 1] - j;
                    cost[u] += vis[u];
                    flag[u]++;
                }
                else {
                    int t = i - zero[cnt - j - 1] - j;
                    cost[u] += min(0, t - vis[u]);
                }
            }
        }
    }
}

void solve() {
    int Min = INF, cnt = 0;
    for(int i = 0; i < L; i++) {
        if(flag[i] == R) {
            if(cost[i] < Min) {
                Min = cost[i];
                cnt = 0;
            }
            if(cost[i] == Min) {
                ans[cnt++] = i;
            }
        }
    }

    printf("%d\n", Min);
    for(int i = 0; i < cnt; i++)
        printf("%d ", ans[i]);
    printf("\n");

}

void init() {
    memset(flag, 0, sizeof(flag));
    memset(cost, 0, sizeof(cost));

    for(int i = 0; i < R; i++)
        input();
}

int main() {
    int test;
    scanf("%d", &test);
    while(test--) {
        scanf("%d%d", &R, &L);
        init();
        solve();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 07:16:08

UVALive - 4629 Knowledge for the masses 高效的相关文章

uva 1444 - Knowledge for the masses(高效)

题目链接:uva 1444 - Knowledge for the masses 题目大意:给出R和L,R表示有R行,L表示一行的最大长度. 对于每一行,给出n,然后是n个数,arr[i]为0表示空格,长度为1,否则表示书架,长度为arr[i].现在人要从上边走到下边,问说最少移动几个书架,并且输出可以通过的路径坐标. 解题思路:c[i]表示第i个坐标有多少行可以通过,当c[i]==R时,表示人可以从该位置穿过整个书架.g[i]表示从i这个位置穿过的代价.然后对于每一行处理,pos[i]记录第i

UVA 1444 - Knowledge for the masses

UVA 1444 - Knowledge for the masses 题目链接 题意:给定R排书架,现在要求最小代价移动书架打开一条通道,每次移动书架的代价为1(距离不限),问最小代价和最小代价的位置 思路:对于每一行,从左往右再从右往左各推一遍,每次把各个位置代价的最小值算出来,计算的过程要记录每个位置对应前面空位个数和空位位置,这样每个书架要移动的代价就能快速算出,最后处理往后,在每个位置遍历找出最小值位置即可 代码: #include <cstdio> #include <cst

B - Knowledge for the masses

uva 1444 Description You are in a library equipped with bookracks that move on rails. There are many parallel rails, i.e., the bookracks are organized in several rows, see figure: The boockracks in the library. There is no passage to the librarian at

HashMap实现 Hash优化与高效散列

OverView Hash table based implementation of the Map interface. This implementation provides all of the optional map operations, and permits null values and the null key. (The HashMap class is roughly equivalent to Hashtable, except that it is unsynch

读书笔记 -《高效程序员的45个习惯-敏捷开发修炼之道》

<高效程序员的45个习惯-敏捷开发修炼之道> 一本2010年出版的书,当时敏捷还只是在国外开始流行,像我这种菜鸟级根本听都没听过.这次通读了这本书,受益良多,回顾自己的职业生涯,多是漫无目的的瞎混,为了生活而生活而已.通过这本书才算对敏捷有了初步的了解,并有意向敏捷进行实践.愿此文可结识更多敏捷的先行者,带领我进入敏捷的世界. 第一章. 敏捷--高效软件开发之道 名言:  不管路走了多远,错了就要重新返回   -- 土耳其谚语 敏捷开发宣言  个体和交互 > 过程和工具 可工作的软件 &

高效程序猿的45个习惯:敏捷开发修炼之道之主题建议翻译1-10

高效程序猿的45个习惯:敏捷开发修炼之道1-10 阅读本书时,总共同拥有45个建议,每一个建议有一个主题,而且每一个建议有2段话,第一段话是一般人的思维,之后作者对这样的思维现象进行剖析,最后得出作者自己的结论,第二段话就是作者的观点. 本次翻译,主要分为5篇来完毕,前四篇每篇为10个建议,最后一个为5个建议.每次翻译的中文在上面,原版英文在最以下展示,已方便大家的对比学习. 因为个人能力有限,如有翻译不恰当之处,还请大家多多不吝赐教,给我留言,给出建议,我会更新文章,让看到文章的人员有所裨益.

读书笔记 -《高效程序猿的45个习惯-敏捷开发修炼之道》

<高效程序猿的45个习惯-敏捷开发修炼之道> 一本2010年出版的书,当时敏捷还仅仅是在国外開始流行,像我这样的菜鸟级根本听都没听过.这次通读了这本书.受益良多.回想自己的职业生涯,多是漫无目的的瞎混,为了生活而生活而已. 通过这本书才算对敏捷有了初步的了解,并有意向敏捷进行实践.愿此文可结识很多其它敏捷的先行者.带领我进入敏捷的世界. 第一章. 敏捷--高效软件开发之道 名言:  无论路走了多远.错了就要又一次返回   -- 土耳其谚语 敏捷开发宣言  个体和交互 > 过程和工具 可工

高效程序员的45个习惯:敏捷开发修炼之道之主题建议翻译1-10

高效程序员的45个习惯:敏捷开发修炼之道1-10 阅读本书时,总共有45个建议,每个建议有一个主题,并且每个建议有2段话,第一段话是一般人的思维,之后作者对这种思维现象进行剖析,最后得出作者自己的结论,第二段话就是作者的观点. 本次翻译,主要分为5篇来完成,前四篇每篇为10个建议,最后一个为5个建议.每次翻译的中文在上面,原版英文在最下面展示,已方便大家的对照学习. 由于个人能力有限,如有翻译不恰当之处,还请大家多多指教,给我留言,给出建议,我会更新文章,让看到文章的人员有所裨益. 后续的剩余翻

低功耗计算机视觉技术前沿,四大方向,追求更小、更快、更高效

深度学习在广泛应用于目标检测.分类等计算机视觉任务中.但这些应用往往需要很大的计算量和能耗.例如处理一张图片分类,VGG-16需要做 150亿次计算,而YOLOv3需要执行390亿次计算. 这就带来一个问题,如何在低功耗的嵌入式系统或移动设备中部署深度学习呢?一种解决办法是将计算任务转移到云侧,但这并不能最终解决问题,因为许多深度学习应用程序需要在端侧进行计算,例如部署在无人机(通常会在断网情况下工作)或卫星上的应用. 从2016年起,业界便开始探索模型加速和小型化的研究,也提出了大量小型化方案