Codeforces - 1088B. Ehab and subtraction

发布于 2024-07-28 20:09:14 字数 2271 浏览 10 评论 0

题目大意

给你 nk ,以及 n 个数,要你从这 n 个数中选取 k 次,每次选最小的,并且选完之后所有的数要减去这个选出来的数。如果里面的数都是 0 了,就输出 0

解析

先排序,然后模拟这个过程:

  • 每次找的时候要找第一个不是 0 的数,如果找到末尾,就输出 0
  • 设置一个 tmp 变量记录当前数要减去的值,这个 tmp 的值是递增的;
  • tmp 递增之后,每次向后减去和 tmp 相同的所有的值,最后一个 >tmp 的值也减去 tmp (这个值就是下一次输出的值);

代码:

#include <bits/stdc++.h>
const int MAX = 100000 + 1;

int main(int argc, char const **argv)
{ 
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int n, k, arr[MAX]; 
    std::cin >> n >> k;
    for(int i = 0; i < n; i++) 
        std::cin >> arr[i];    
    std::sort(arr, arr+n);
    int tmp = 0;
    int pos = 0;
    for(int i = 0; i < k; i++){ 
        while(arr[pos] == 0 && pos < n)
            pos++;
        if(pos == n){ 
            std::cout << 0 << std::endl;
            continue;
        }
        std::cout<< arr[pos] << std::endl;
        tmp += arr[pos];
        pos++;
        while(arr[pos] == tmp) // next equal elements should subtract tmp
            arr[pos++] -= tmp;
        arr[pos] -= tmp; // the last greater than tmp also subtract tmp
    }
    return 0;
}

或者稍微改进一下:

#include <bits/stdc++.h>

const int MAX = 100000 + 1;

int main(int argc, char const **argv)
{ 
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int n, k, arr[MAX]; 
    std::cin >> n >> k;
    for(int i = 0; i < n; i++) 
        std::cin >> arr[i];    
    std::sort(arr, arr+n);
    int tmp = 0, pos = 0;
    for(int i = 0; i < k; i++){ 
        while(arr[pos] == tmp && pos < n)
            pos++;
        if(pos == n)
            std::cout << 0 << std::endl;
        else 
            std::cout << arr[pos]-tmp << std::endl;
        tmp = arr[pos];
    }
    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

公布

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

内心激荡

文章 0 评论 0

JSmiles

文章 0 评论 0

左秋

文章 0 评论 0

迪街小绵羊

文章 0 评论 0

瞳孔里扚悲伤

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文