赞
踩
现有3种蛋糕,每个蛋糕都有一个称为美味度的整数值,如下所示:
现要求买三个蛋糕,每种蛋糕各一个,显然共有种方法,对其按照美味度总和降序排列。输出前 种方法的蛋糕美味度总和。
- vector<ll> a,b,c;
-
- int main() {
- int x,y,z,K;
- cin >> x >> y >> z >> K;
- for(int i=0;i<x;i++) {
- ll t; cin >> t;
- a.push_back(t);
- }
- for(int i=0;i<y;i++) {
- ll t; cin >> t;
- b.push_back(t);
- }
- for(int i=0;i<z;i++) {
- ll t; cin >> t;
- c.push_back(t);
- }
- //处理前两种组合
- vector<ll> ab;
- for(int i=0;i<x;i++) {
- for(int j=0;j<y;j++) {
- ab.push_back(a[i]+b[j]);
- }
- }
- sort(ab.begin(),ab.end(),greater<ll>());
- // 取前K种和第三种组合,注意前两种若不够K,要取min
- vector<ll> ans;
- for(int i=0;i<min(K,x*y);i++) {
- for(int j=0;j<z;j++) {
- ans.push_back(ab[i]+c[j]);
- }
- }
- sort(ans.begin(),ans.end(),greater<ll>());
- for(int i=0;i<K;i++) cout << ans[i] << endl;
- return 0;
- }
-
- ll a[1005],b[1005],c[1005];
-
- int main() {
- int x,y,z,K;
- cin >> x >> y >> z >> K;
- for(int i=0;i<x;i++) cin >> a[i];
- for(int i=0;i<y;i++) cin >> b[i];
- for(int i=0;i<z;i++) cin >> c[i];
- sort(a,a+x,greater<ll>());
- sort(b,b+y,greater<ll>());
- sort(c,c+z,greater<ll>());
-
- vector<ll> ans;
- for(int i=0;i<x;i++) {
- for(int j=0;j<y;j++) {
- for(int k=0;k<z;k++) {
- //按照序号依次取
- if((i+1)*(j+1)*(k+1) <= K) ans.push_back(a[i]+b[j]+c[k]);
- }
- }
- }
- sort(ans.begin(),ans.end(),greater<ll>());
- for(int i=0;i<K;i++) cout << ans[i] << endl;
- return 0;
- }
- #include<bits/stdc++.h>
- using namespace std;
-
- typedef long long ll;
- typedef unsigned long long ull;
-
- ll a[1005],b[1005],c[1005];
-
- struct Node{
- int i,j,k;
- Node(){}
- Node(int i,int j,int k):i(i),j(j),k(k){}
-
- bool operator < (const Node &A) const {
- return a[i]+b[j]+c[k] < a[A.i]+b[A.j]+c[A.k];
- }
- };
-
- priority_queue<Node> pq;
- map<pair<pair<int,int>,int>,int> mp; //下标组合去重
-
- int main() {
- int x,y,z,K;
- cin >> x >> y >> z >> K;
- for(int i=0;i<x;i++) cin >> a[i];
- for(int i=0;i<y;i++) cin >> b[i];
- for(int i=0;i<z;i++) cin >> c[i];
- sort(a,a+x,greater<ll>());
- sort(b,b+y,greater<ll>());
- sort(c,c+z,greater<ll>());
-
- pq.push(Node(0,0,0));
- mp[make_pair(make_pair(0,0),0)] = 1;
- while(K--) {
- Node now = pq.top();
- int ni=now.i; int nj=now.j; int nk=now.k;
- pq.pop();
- cout << a[ni] + b[nj] + c[nk] << endl;
- // 下标合法 && 下标组合未重复
- if(ni+1 < x && !mp.count(make_pair(make_pair(ni+1,nj),nk))) {
- pq.push(Node(ni+1,nj,nk));
- mp[make_pair(make_pair(ni+1,nj),nk)] = 1;
- }
- if(nj+1 < y && !mp.count(make_pair(make_pair(ni,nj+1),nk))) {
- pq.push(Node(ni,nj+1,nk));
- mp[make_pair(make_pair(ni,nj+1),nk)] = 1;
- }
- if(nk+1 < z && !mp.count(make_pair(make_pair(ni,nj),nk+1))) {
- pq.push(Node(ni,nj,nk+1));
- mp[make_pair(make_pair(ni,nj),nk+1)] = 1;
- }
- }
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。