首页 > 其他分享 >nfls15095 Atcoder-abc123_d 蛋糕

nfls15095 Atcoder-abc123_d 蛋糕

时间:2023-08-02 20:34:40浏览次数:30  
标签:Atcoder return 蛋糕 int st nfls15095 chs abc123 美味

Atcoder-abc123_d
AT 小卖部从下学期开始售卖带有数字形状的蛋糕,\(X\),\(Y\) 和 \(Z\) 种蛋糕分别带有 \(1\) 形,\(2\) 形和 \(3\) 形蜡烛,而且每个蛋糕都有美味值,如下所示:

  • 带有 \(1\) 形蜡烛的美味值有: \(A_1,A_2,\cdots,A_X\)
  • 带有 \(2\) 形蜡烛的美味值有: \(B_1,B_2,\cdots,B_Y\)
  • 带有 \(3\) 形蜡烛的美味值有: \(C_1,C_2,\cdots,C_Z\)

你决定购买三个蜡烛不同的蛋糕,请你将每种方案的美味值由大到小排序,依次打印前 \(K\) 种方案的美味值。
一行四个整数\(X,Y,Z,K\)如题

一行\(X\)个整数,表示第一种蛋糕的美味值

一行\(Y\)个整数,表示第二种蛋糕的美味值

一行\(Z\)个整数,表示第三种蛋糕的美味值
\(K\)行,从大到小输出前\(K\)种方案的美味值

方法一:
枚举,前面两个序列合并求和o(1e6),sort求前k大,再和第三个合并求和,o(1e6),sort求前k大,
方法二:
堆。将三个数组升序排序,先把最小的三元组(1,1,1),放入堆中,我们每次从堆中取出最小的三元组,即为当前轮的答案,再将它的每一维分别进行调整,向堆中加入三个三元组,即可保证每次取出的都是最小的。
每轮都会从堆中删除一个,加入三个,一共k轮,故堆中的元素不会超过2k,空间得到保证。用set更好,避免完全相同的下标三元组。
另:set存放不同的值,要强行钦定一个顺序。下标不同但值相同的元素组,都会保留。

    if (p.i != q.i) {
        return p.i > q.i;
    } else if (p.j != q.j) {
        return p.j > q.j;
    } else {
        return p.k > q.k;
    }

完整代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct chs {
int i, j, k;
chs(int x = 0, int y = 0, int z = 0) {
    i = x; j = y; k = z;
}
};
ll a[1005];
ll b[1005];
ll c[1005];
bool operator <(chs p, chs q) {
    if (a[p.i] + b[p.j] + c[p.k] != a[q.i] + b[q.j] + c[q.k]) {
        return a[p.i] + b[p.j] + c[p.k] > a[q.i] + b[q.j] + c[q.k];
    }
    if (p.i != q.i) {
        return p.i > q.i;
    } else if (p.j != q.j) {
        return p.j > q.j;
    } else {
        return p.k > q.k;
    }
}
set<chs> st;
int main() {
    int X, Y, Z, K;
    scanf("%d %d %d %d", &X, &Y, &Z, &K);
    for (int i = 0; i < X; i++) {
        scanf("%lld", &a[i]);
    }
    for (int i = 0; i < Y; i++) {
        scanf("%lld", &b[i]);
    }
    for (int i = 0; i < Z; i++) {
        scanf("%lld", &c[i]);
    }
    sort(a, a + X, greater<ll>());
    sort(b, b + Y, greater<ll>());
    sort(c, c + Z, greater<ll>());
    st.insert(chs(0, 0, 0));
    while (K--) {
        chs x = *st.begin();
        st.erase(st.begin());
        printf("%lld\n", a[x.i] + b[x.j] + c[x.k]);
        if (x.i < X - 1) st.insert(chs(x.i + 1, x.j, x.k));
        if (x.j < Y - 1) st.insert(chs(x.i, x.j + 1, x.k));
        if (x.k < Z - 1) st.insert(chs(x.i, x.j, x.k + 1));
    }
    return 0;
}

标签:Atcoder,return,蛋糕,int,st,nfls15095,chs,abc123,美味
From: https://www.cnblogs.com/caterpillor/p/17601678.html

相关文章

  • Practice on Codeforces and Atcoder in May
    CF补题题解2023.5说明:CF题直接去luogu看翻译,AT题会附上简要题意CF1821E先考虑如何高速计算权值一个显而易见的贪心是尽量在右边取括号消除,设右括号为1,左括号为-1那么我们每一次消除的括号\(i,i+1\)都满足了\(i+1\)的右边剩下的全部是右括号,代价就是往右数的个数更进一......
  • Practice on Codeforces and Atcoder in June
    \(Practice\)\(on\)\(codeforces\)\(in\)\(June\)wk,误删了4个题,但我不想补了\(CF1839D\)题意:给一个正整数序列\(a\),给定\(k\)个0,将其放进序列的任意位置里,可以进行无限次操作,每次将一个挨着0的数移动到序列的任意位置,最后删掉所有的0,求使得序列变成递增序列的最小操作......
  • Practice on Codeforces and Atcoder in July
    \(1844E\)题意:定义一个矩形\(a\)是好的,当且仅当其满足以下条件:矩形中每一个元素\(x\)都为\(A,B,C\)其中之一每一个\(2\times2\)的子矩形都必须包含三个不同的字符共用一条边的两个元素不相等给定\(k\)个限制条件,限制条件分为两类:\((x,x+1,y,y+1)\),限制\(a[x......
  • AtCoder Beginner Contest 165
    AtCoderBeginnerContest165https://atcoder.jp/contests/abc165C-ManyRequirementsdfs#include<bits/stdc++.h>usingnamespacestd;constintN=15,M=55;intn,m,q,ans;inta[M],b[M],c[M],d[M],A[N];voiddfs(intx){if(x>......
  • AtCoder Beginner Contest 312
    A-Chord#include<bits/stdc++.h>usingnamespacestd;int32_tmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);strings;cin>>s;if(s=="ACE")cout<<"Yes\n";e......
  • [UNIQUE VISION Programming Contest 2023 Summer(AtCoder Beginner Contest 312) - A
    UNIQUEVISIONProgrammingContest2023Summer(AtCoderBeginnerContest312)-AtCoderA-Chord(atcoder.jp)#include<bits/stdc++.h>#defineendl'\n'usingnamespacestd;intmain(){vector<string>str{"ACE",&qu......
  • Atcoder-Beginner-Contest-312 A~Ex
    \(Atcoder-Beginner-Contest-312\)AB过于简单,在此略去。\(C-Invisible\)\(Hand\)题意:给定长为\(n\)的数组\(a\),长为\(m\)的数组\(b\),找到最小的非负整数\(x\),使得\(\sum_{i=1}^n[a_i\lex]\ge\sum_{i=1}^m[b_i\gex]\)题解:容易发现,随着\(x\)的增大,右式单调不升,左......
  • (AtCoder Beginner Contest 312)
    (AtCoderBeginnerContest312)A-Chord#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong//#defineint__int128typedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<string,string>PSS;constintN......
  • Atcoder ABC259H Yet Another Path Counting
    首先可以想到有组合数的方法:令起点为\((x1,y1)\),终点为\((x2,y2)\),则路径方案数就为\(\binom{x2+y2-x1-y1}{x2-x1}\),这样设有\(k\)个相同颜色的点,时间复杂度就为\(O(k^2)\)。再考虑到还有\(\text{DP}\)方法:令\(f_{x,y}\)为走到\((x,y)\)的方案数,不限制......
  • Atcoder ARC060D Digit Sum
    看到\(n\le10^{11}\),考虑按根号分为两部分处理。对于\(b\le\sqrt{n}\),考虑直接暴力算\(\operatorname{f}(b,n)\)判断是否等于\(s\),这部分的计算量是\(O(\sqrt{n})\)级别的。对于\(\sqrt{n}<b\len\),则这个时候在\(b\)进制下\(n\)也只有两位,考虑列出\(n,s\)......