草庐IT

CF构造题1600-1800(1)

随便写点什么 2023-03-28 原文

D. Same Count One(Polynomial Round 2022 (Div. 1 + Div. 2, Rated, Prizes!))

题意

给定 \(n\) 个长度为 \(m\) 的 01 序列,每次操作可以选择两个序列a1, a2,并选择一个\(pos\), std::swap(a1[pos], a2[pos]), 求是每个序列中的 \(1\) 的个数都相等所需的最小操作数。

思路

可以发现 (\(1\) 的总数 ) \(\bmod \ n \neq 0\) 时, 是无解的。

\(avg =\) (\(1\) 的总数 ) \(/ n\), 我们可以把这 \(n\) 个序列分为两类,严格小于 \(avg\) 的 和严格大于 \(avg\) 的,其他的序列可以丢掉。

严格大于 \(avg\) 的序列都可以为 严格小于 \(avg\) 的序列补充 \(1\), 直到 严格大于 \(avg\) 的序列 \(1\) 的个数等于 \(avg\) 或者 严格小于 \(avg\) 的序列 \(1\) 个数等于 \(avg\)

直接模拟即可。

实现

void solve_problem() {
    int n, m;
    std::cin >> n >> m;
    std::vector a(n, std::vector<int>(m, 0));
    int avg = 0;
    for (int i = 0;i < n; i++) {
        for (int j = 0; j < m; j++) {
            std::cin >> a[i][j];
            avg += a[i][j];
        }
    }
    if (avg % n == 0) {
        if (n == 1) {
            std::cout << 0 << "\n";
            return;
        }
        avg /= n;
        std::vector<std::pair<int,int>> q1, q2;
        for (int i = 0; i < n; i++) {
            int cnt = 0;
            for (int j = 0; j < m; j++) {
                cnt += a[i][j];
            }
            if(cnt < avg) q1.push_back({cnt, i});
            else if (cnt > avg) q2.push_back({cnt, i});
        }
        int ans1 = 0;
        std::vector<std::array<int, 3>> ans2;
        for (int i = 1; i <= n; i++) {
            if (q1.empty() || q2.empty()) break;
            auto [c1, i1] = q1[0];
            auto [c2, i2] = q2[0];
            int d = avg - c1;
            for (int j = 0; j < m; j++) {
                if (d == 0 || c2 == avg) {
                    break;
                } 
                if (a[i2][j] == 1 && a[i1][j] == 0) {
                    std::swap(a[i2][j], a[i1][j]);
                    c1++;
                    c2--;
                    d--;
                    ans2.push_back({i2 + 1, i1 + 1, j + 1});
                    ans1++;
                }
            }
            q1[0] = {c1, i1};
            q2[0] = {c2, i2};
            if (c1 == avg) q1.erase(q1.begin());
            if (c2 == avg) q2.erase(q2.begin());
        }
        std::cout << ans1 << "\n";
        for (auto [x, y, z] : ans2) {
            std::cout << std::max(x, y) << " " << std::min(y, x) << " " << z << "\n";
        }
    } else {
        std::cout << -1 << "\n";
    }
}

D. Watch the Videos(2022-2023 ICPC, NERC, Southern and Volga Russian Regional Contest (Online Mirror, ICPC Rules, Preferably Teams))

题意

\(n\) 个大小随意的视频和 \(1\) 个大小为 \(m\) 的磁盘,视频要下载到磁盘中才可以开始观看,下载第 \(i\) 个视频花费 \(a_i\) 的时间,开始下载第\(i\)个视频时,磁盘中要至少有\(a_i\)的空间才可以开始,下载完成需要花费 \(1\) 的时间观看完,看完之后视频立刻被从磁盘中删除,求看完所有视频需要的时间。(一次只能下载一个视频,观看视频的时候可以开始下载视频)

思路

最坏的答案(每次看完一个视频后才开始下载下一个视频), 计算方法为:

\[ans = n + \sum_{i = 1}^n a_i \]

可以发现如果在观看视频时下载视频,答案就可以 \(-1\)

要想使答案最小,只需要尽可能多的在观看视频时开始下载视频即可。

假设视频序列 \(a\) 从小到大排序, 那么可以找到一个最大的 \(pos (1\leq pos \leq n)\), 使得序列

\[[a_{pos},a_1,a_{pos-1},a_2,a_{pos-2},a_3,\cdots] \]

相邻两个数的和小于等于 \(m\)

按照这个序列观看,有 \(pos - 1\) 个视频是在正在观看视频时开始下载的。可以使答案减少 \(pos - 1\)

\(pos\) 是满足单调性的,因此可以二分来找到最大的 \(pos\)

实现

void solve_problem() {
    int n, m;
    std::cin >> n >> m;
    std::vector<int> a(n);
    for (auto &x : a) {
        std::cin >> x;
    }
    std::sort(a.begin(), a.end());
    auto check = [&](int x) {
        int l = 0, r = x - 1;
        while (l < r) {
            if (a[r] > m - a[l]) return false;
            r--;
            l++;
        }
        return true;
    };
    int l = 1, r = n, ans = 0;
    while (l <= r) {
        int mid = (l + r) >> 1;
        if (check(mid)) {
            ans = mid;
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }
    std::cout << std::accumulate(a.begin(), a.end(), 0LL) + (n - ans + 1) << "\n";
}

D. Range = √Sum(Codeforces Round #836 (Div. 2))

题意

构造一个长度为 \(n\) 的数组 \(a_1,a_2, a_3, \dots,a_n\),使 \(a_i\) 各不相同,且 \(max(a_1,a_2, a_3, \dots,a_n) - min(a_1,a_2, a_3, \dots,a_n) = \sqrt{a_1,a_2, a_3, \dots,a_n}\)

思路

\(n\) 为偶数时, 数组为:

\[\frac{n}{2},\frac{n}{2} + 1,\cdots ,n,n + 1,n + 2,n + \frac{n}{2}. \]

数组可以被分成 \(\frac{n}{2}\) 组,每组的和都为 \(2n\)

\(n\) 为奇数时,我们尝试 \(max(a) - max(b) = n + 1\), 因此数组的和应为 \(n^2 + 2n + 1\)

尝试使用 \(n - 1\) 个数分为 \(\frac{n-1}{2}\) 组,每组和为 \(2(n+1)\), 组成的数组和为 \(n^2 - 1\)

此时这 \(n - 1\) 个数为:

\[\frac{n - 1}{2} + 2,\frac{n - 1}{2} + 3,\cdots,\frac{n - 1}{2} + \frac{n - 1}{2},n + 2,n + 3,\cdots,n + \frac{n - 1}{2} + 1 \]

知道了最小项,最大项也可以计算出来 \(n + \frac{n - 1}{2} + 3\)

这时数组的和为:

\[n^2 - 1 + n + \frac{n - 1}{2} + 3 = n^2 + n + \frac{n - 1}{2} + 2 \]

距离 \(n^2 + 2n + 1\) 还需要:

\[\begin{aligned} (n^2 + 2n + 1) - (n^2 + n + \frac{n - 1}{2} + 2) &= n - \frac{n - 1}{2} - 1\\ &=\frac{2n - n + 1 - 2}{2}\\ &=\frac{n - 1}{2} \end{aligned} \]

我们可以让 第 \(\frac{n - 1}{2} + 1\) 项到第 \(n - 1\) 项都 \(+1\) 来抵消掉 \(\frac{n - 1}{2}\)

因为第 \(n - 1\)\(n + \frac{n - 1}{2} + 1\) 与 第 \(n\)\(n + \frac{n - 1}{2} + 3\) 相差 \(2\),所以 \(+1\) 操作不会使数组产生重复的数。

此时我们的数组已经构造完成:

\[\frac{n - 1}{2} + 2,\frac{n - 1}{2} + 3,\cdots,\frac{n - 1}{2} + \frac{n - 1}{2},n + 3,n + 4,\cdots,n + \frac{n - 1}{2} + 2,n + \frac{n - 1}{2} + 3 \]

实现

void solve_problem() {
    int n;
    std::cin >> n;
    if (n % 2 == 0) {
        for (int i = 0; i < n/2; i++) std::cout << (n/2 + i) << " ";
        for (int i = 1; i <= n/2; i++) std::cout << (n + i) << " ";
        std::cout << "\n";
    } else {
        for (int i = 1; i <= (n - 1) / 2; i++) std::cout << (n - 1) / 2 + i + 1 << " ";
        for (int i = 1; i <= (n - 1) / 2; i++) std::cout << n + i + 2 << " ";
        std::cout << n + (n - 1) / 2 + 3<< "\n";
    }
}

有关CF构造题1600-1800(1)的更多相关文章

  1. ruby - 我如何从 Rational(或任何没有构造函数的类)继承? - 2

    例如,我可以很容易地继承自String,如下所示:classMyString'thingsandstuff'但是我如何继承没有构造函数的Rational呢?例如:defMyRatNoMethodError:undefinedmethod`new'forMyRat:ClassMyRat(10).inc#=>NoMethodError:undefinedmethod`MyRat'formain:ObjectMyRat.send(:initialize,10).inc#=>TypeError:alreadyinitializedclass#???#Noneofitworks!我找不到初始化新

  2. ruby - 这种类似哈希/树状的构造称为什么? - 2

    我想创建一个介于散列和树之间的“Config”类。它只是用于存储全局值,可以有一个上下文。下面是我的使用方法:Config.get("root.parent.child_b")#=>"value"类可能如下所示:classConstructdefget(path)#splitpathby"."#searchtreefornodesenddefset(key,value)#splitpathby"."#createtreenodeifnecessary#settreevalueenddeftree{:root=>{:parent=>{:child_a=>"value",:child_b=

  3. ruby - 将构造函数参数转换为实例变量 - 2

    这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Idiomaticobjectcreationinruby很多时候我有一个initialize方法,看起来像这样:classFoodefinitializebar,buz,...@bar,@buz,...=bar,buz,...endend有没有办法用一个简单的命令来做到这一点,比如:classFooattr_constructor:bar,:buz,...end其中的符号代表实例变量的名称(具有attr_accessor、attr_reader、attr_writer的精神/风格)?我想知道是否有内置的方式

  4. 通过传递构造函数的 Ruby YAML 解析器 - 2

    我正在开发一个应用程序,该应用程序从YAML文件获取输入,将它们解析为对象,然后让它们执行它们的操作。我现在遇到的唯一问题是YAML解析器似乎忽略了对象“初始化”方法。我指望构造函数用默认值填充YAML文件缺少的任何实例变量,并将一些东西存储在类变量中。这是一个例子:classTest@@counter=0definitialize(a,b)@a=a@b=b@a=29if@b==3@@counter+=1enddefself.how_manyp@@counterendattr_accessor:a,:bendrequire'YAML'a=Test.new(2,3)s=a.to_yaml

  5. Ruby 构造函数和异常 - 2

    Ruby新手,我想弄清楚使用什么习惯用法来将某些整数值限制为类的构造函数。根据我目前所做的,如果我在initialize()中引发异常,该对象仍会创建,但将处于无效状态(例如,某些nil实例变量中的值)。我不太明白我应该如何限制这些值而不进入看起来不必要的大步骤,例如限制对new()的访问。所以我的问题是,我可以通过什么机制来限制实例化对象的值范围? 最佳答案 嗯,你是完全正确的,即使initialize引发异常,对象仍然存在。然而,任何人都很难坚持引用,除非你从initialize中泄漏self就像我刚写的下面的代码一样:>>cl

  6. ruby-on-rails - 如何使用 Ruby 中哈希的查询参数构造 URI - 2

    如何通过传递哈希来构造带有查询参数的URI对象?我可以生成查询:URI::HTTPS.build(host:'example.com',query:"a=#{hash[:a]},b=#{[hash:b]}")产生https://example.com?a=argument1&b=argument2但是我认为为许多参数构造查询字符串将不可读且难以维护。我想通过传递哈希来构造查询字符串。就像下面的例子:hash={a:'argument1',b:'argument2'#...dozenmorearguments}URI::HTTPS.build(host:'example.com',que

  7. ruby - 如何更改 Ruby 中类构造函数的返回值? - 2

    我有课,Foo。我希望能够向构造函数传递一个Foo实例,foo并返回相同的实例。换句话说,我希望这个测试通过:classFoo;endfoo=Foo.newbar=Foo.new(foo)assert_equalfoo,bar有人知道我该怎么做吗?我试过这个:classFoodefinitialize(arg=nil)returnargifargendendfoo=Foo.newbar=Foo.new(foo)assert_equalfoo,bar#=>fails但它不起作用。帮忙吗?编辑因为很多人问过我的理由:我正在对大量数据(许多TB)进行快速分析,并且我将拥有大量对象的大量实例。

  8. ruby-on-rails - 文字和构造函数之间的区别? ([] 与 Array.new 和 {} 与 Hash.new) - 2

    我很想知道[]和Array.new以及{}和Hash.new之间的更多区别我对它进行了相同的基准测试,似乎简写是赢家require'benchmark'many=500000Benchmark.bmdo|b|b.report("[]\t"){many.times{[].object_id}}b.report("Array.new\t"){many.times{Array.new.object_id}}b.report("{}\t"){many.times{{}.object_id}}b.report("Hash.new\t"){many.times{Hash.new.object_id

  9. ruby - 构造函数覆盖 - 2

    我有一个类:classOnedefinitialize;endend我需要像这样用我自己的构造函数创建一个新类:classTwo但是当我启动代码时,出现错误:thingtest.rb:10:in`initialize':wrongnumberofarguments(1for0)(ArgumentError) 最佳答案 super在这种情况下(没有括号)是一种特殊形式。它使用原始参数调用父类(superclass)方法。尝试调用super() 关于ruby-构造函数覆盖,我们在StackO

  10. ruby - 在 ruby​​ 中调用父构造函数 - 2

    如何调用父类的构造函数?moduleCattr_accessor:c,:ccdefinitializationc,cc@c,@cc=c,ccendendclassBattr_accessor:b,:bbdefinitializationb,bb@b,@bb=b,bbendendclassA谢谢。 最佳答案 Ruby没有构造函数,因此显然不可能调用它们,无论是父类还是其他。然而,Ruby确实有方法,并且为了调用与当前正在执行的方法同名的父方法,您可以使用super关键字。[注意:不带参数的super是传递与当前正在执行的方法相同的参数

随机推荐