西部世界中有个赏金猎人,每个赏金猎人都有两个属性战斗力和所拥有金钱。(
分别表示第
个赏金猎人的战斗力和所拥有金钱,保证每个赏金猎人的战斗力不相同)。每一个赏金猎人只有
发子弹,这意味着他最多可以击败
个战斗力比他小的赏金猎人并获取他们的金钱。你能输出每一个赏金猎人最多拥有多少金钱
西部世界中有个赏金猎人,每个赏金猎人都有两个属性战斗力和所拥有金钱。(
分别表示第
个赏金猎人的战斗力和所拥有金钱,保证每个赏金猎人的战斗力不相同)。每一个赏金猎人只有
发子弹,这意味着他最多可以击败
个战斗力比他小的赏金猎人并获取他们的金钱。你能输出每一个赏金猎人最多拥有多少金钱
第一行包含两个整数。
第二行包含个整数
。
第三行包含个整数
。
输出一行包含个整数,第
个整数表示第
个赏金猎人最多拥有金钱数。
3 1 1 8 3 1 8 5
1 13 6
第一个猎人战斗力只有1,不能击败任何人。第二个猎人可以击败第三个猎人,因此他的金钱为13。第三个猎人可以击败第一个猎人,所以他的金钱为6。
#include<bits/stdc++.h> using namespace std; int main() { int n, k; cin >> n >> k; vector<vector<int> > arr(n, vector<int>(3)); for (int i = 0; i < n; i++) { arr[i][2] = i; // 记录编号 cin >> arr[i][0]; // 输入attack } for (int i = 0; i < n; i++) { cin >> arr[i][1]; // 输入money } sort(arr.begin(), arr.end()); // 按战斗力排序 int sum = 0; vector<int> res(n); priority_queue<int, vector<int>, greater<int> > Q; for (auto& it : arr) { // 后面的肯定能战胜前面所有的 int money = it[1], i = it[2]; sum += money; res[i] = sum; Q.push(money); if (Q.size() > k) { sum -= Q.top(); Q.pop(); } } for (auto x : res) { cout << x << " "; } cout << endl; return 0; }按attack值排序,小于它的肯定可以被他打败,再设置一个大小为k的优先队列即可。
#include <bits/stdc++.h> using namespace std; struct hunter { int atk, m, idx; }; int main() { // n个人,每人k发子弹 int n, k; cin >> n >> k; vector<int> attack(n); vector<int> money(n); for(int i = 0; i < n; i++) { cin >> attack[i]; } for(int i = 0; i < n; i++) { cin >> money[i]; } // 初始化结构体 hunter hs[n]; for(int i = 0; i < n; i++) { hs[i] = { .atk = attack[i], .m = money[i], .idx = i }; } // 释放内存 vector<int>().swap(attack); vector<int>().swap(money); sort(hs, hs + n, [&](hunter a, hunter b) {return a.atk < b.atk;}); vector<int> res(n); int curr_sum = 0; priority_queue<int, vector<int>, greater<int>> q; for(int i = 0; i < n; i++) { res[hs[i].idx] = hs[i].m; if(i != 0) { int _idx = i - 1; if(q.size() < k) { curr_sum += hs[_idx].m; q.push(hs[_idx].m); } else if(k > 0 && hs[_idx].m > q.top()) { curr_sum = curr_sum - q.top() + hs[_idx].m; q.pop(); q.push(hs[_idx].m); } res[hs[i].idx] += curr_sum; } } cout << res[0]; for(int i = 1; i < n; i++) { cout << " " << res[i]; } return 0; }
import java.io.*; import java.util.*; class Hunter { public int id; public int attack; public int money; public Hunter(int i, int attack) { this.id = i; this.attack = attack; } } public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] params = br.readLine().split(" "); int n = Integer.parseInt(params[0]); int k = Integer.parseInt(params[1]); Hunter[] hunter = new Hunter[n]; params = br.readLine().split(" "); for(int i = 0; i < n; i++){ hunter[i] = new Hunter(i, Integer.parseInt(params[i])); } params = br.readLine().split(" "); for(int i = 0; i < n; i++){ hunter[i].money = Integer.parseInt(params[i]); } // 所有赏金猎人按照攻击力升序排列 Arrays.sort(hunter, (h1, h2) -> h1.attack - h2.attack); // 建立一个按钱升序排列且容量为k的小根堆,用来存储每个赏金猎人能干掉的对手中钱最多的topk PriorityQueue<Hunter> minHeap = new PriorityQueue<>((h1, h2) -> h1.money - h2.money); int[] res = new int[n]; int moneyInHeap = 0; // 堆中的钱数,堆中放当前赏金猎人能pk过的对手中,钱最多的topk的资金总和 // 为了能够累加前面的结果,从攻击力小的赏金猎人开始计算 for(int i = 0; i < n; i++){ res[hunter[i].id] = hunter[i].money + moneyInHeap; if(minHeap.size() < k){ moneyInHeap += hunter[i].money; minHeap.offer(hunter[i]); }else{ if(minHeap.peek().money < hunter[i].money){ moneyInHeap -= minHeap.poll().money; minHeap.offer(hunter[i]); moneyInHeap += hunter[i].money; } } } for(int i = 0; i < n; i++){ System.out.print(res[i] + " "); } } }
import java.util.*; public class Main { public static void main(String[]args){ Scanner sc = new Scanner(System.in); String s = sc.nextLine(); String[] str = s.split(" "); int n = Integer.parseInt(str[0]); int k = Integer.parseInt(str[1]); String s1 = sc.nextLine(); String s2 = sc.nextLine(); String[] str1 = s1.split(" "); String[] str2 = s2.split(" "); //int[] attack = new int[n]; //int[] money = new int[n]; ArrayList<ArrayList<Integer>> list = new ArrayList<>(); for(int i=0;i<n;i++){ ArrayList<Integer> list0 = new ArrayList<>(); list0.add(Integer.parseInt(str1[i])); list0.add(Integer.parseInt(str2[i])); list.add(list0); } //ArrayList<ArrayList<Integer>> old = list; //System.out.println(old); //按照战斗力排序,正序 Collections.sort(list,new Comparator<ArrayList<Integer>>(){ public int compare(ArrayList<Integer> o1,ArrayList<Integer> o2){ return o1.get(0)-o2.get(0); } }); HashMap<ArrayList<Integer>,Integer> map = new HashMap<>(); int money = 0; //记录money排序,正序排序 ArrayList<ArrayList<Integer>> moneynum = new ArrayList<>(); for(int i=0;i<list.size();i++){ //需要考虑k发子弹是否超过人数,攻击力最低一个可能一发子弹一个都打出去 if(i<=k) { money = money + list.get(i).get(1); moneynum.add(list.get(i)); }else if(i>k) { money = list.get(i).get(1) + map.get(list.get(i-1))-moneynum.get(0).get(1); //去除最低的金额的 moneynum.remove(0); //将当前金额加入集合 moneynum.add(list.get(i)); } map.put(list.get(i),money); //金额排序,方便下一次计算 Collections.sort(moneynum,new Comparator<ArrayList<Integer>>(){ public int compare(ArrayList<Integer> o1,ArrayList<Integer> o2){ return o1.get(1)-o2.get(1); } }); } //打印 for(int i=0;i<n;i++){ ArrayList<Integer> list0 = new ArrayList<>(); list0.add(Integer.parseInt(str1[i])); list0.add(Integer.parseInt(str2[i])); if(i<n-1){ System.out.print(map.get(list0)+" "); }else{ System.out.print(map.get(list0)); } } } }
import java.util.*; //HashMap+ArrayList+自然排序+定制排序,用例全部通过,只是时间略微有点长 public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String s = input.nextLine(); String[] arr = s.split(" "); int n = Integer.parseInt(arr[0]); int k = Integer.parseInt(arr[1]); if (k > 10) { k = 10; } String s1 = input.nextLine(); String s2 = input.nextLine(); String[] arr1 = s1.split(" "); String[] arr2 = s2.split(" "); long[] money = new long[n]; //定制排序 TreeSet<Hunter> set = new TreeSet(new Comparator<Hunter>(){ @Override public int compare(Hunter o1, Hunter o2) { if(o1.attack > o2.attack){ return -1; } if(o1.attack < o2.attack){ return 1; } if (o1.attack == o2.attack){ return 0; } return 0; } }); List<Hunter> list = new ArrayList<>(); for (int i = 0; i < n; i++) { money[i] = Long.valueOf(arr2[i]); Hunter hunter = new Hunter(i, Long.valueOf(arr1[i]), Long.valueOf(arr2[i])); set.add(hunter); list.add(hunter); } //自然排序 Collections.sort(list); long countMoney; Iterator<Hunter> iterator = set.iterator(); for(int i = 0;i < set.size() - 1;i++){ Hunter h = iterator.next(); countMoney = money[h.index]; int count = 0; for (Hunter h1 : list) { if(h.attack > h1.attack){ countMoney += h1.money; count++; } if(count >= k){ break; } } money[h.index] = countMoney; } for(int i = 0;i < n;i++){ System.out.print(money[i]); if(i < n - 1){ System.out.print(" "); } } } static class Hunter implements Comparable<Hunter>{ public int index; public long attack; public long money; public Hunter(int index, long attack, long money) { this.index = index; this.attack = attack; this.money = money; } @Override public int compareTo(Hunter o) { if(this.money > o.money){ return -1; } if(this.money < o.money){ return 1; } if (this.money == o.money){ return 0; } return 0; } } }
#include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main(){ int n, k; vector<int> av; map<int, int, greater<int>> hm; cin>>n>>k; for(int i=0; i<n; i++){ int curNum; cin>>curNum; av.push_back(curNum); } for(int i=0; i<n; i++){ int curNum; cin>>curNum; hm.insert(pair<int, int>(av[i], curNum)); } for(int i=0; i<n; i++){ int curA = av[i]; auto iter = hm.find(curA); int tmpK = k; long curScore = iter->second; while(++iter != hm.end() && tmpK-- > 0){ if(iter->first < curA){ curScore += iter->second; } } cout<<curScore<<" "; } return 0; }
#include<iostream> #include<queue> #include<vector> #include<algorithm> #include<unordered_map> using namespace std; int main() { int n, k; while (cin >> n >> k) { unordered_map<int, int> hash; vector<int> attack; int money[100001]; long res[100001]; for (int i = 0; i < n; i++) { int tmp; cin >> tmp; attack.push_back(tmp); hash[tmp] = i; } for (int i = 0; i < n; i++) { int tmp; cin >> tmp; money[i] = tmp; res[i] = tmp; } sort(attack.begin(), attack.end()); priority_queue<int, vector<int>, greater<int>> q; int sum = 0; if (k > 0) { for (int i = 1; i < n; i++) { if (q.size() < k) { q.push(money[hash[attack[i - 1]]]); sum += money[hash[attack[i - 1]]]; } else if (money[hash[attack[i - 1]]] > q.top()) { sum -= q.top(); q.pop(); q.push(money[hash[attack[i - 1]]]); sum += money[hash[attack[i - 1]]]; } res[hash[attack[i]]] += sum; } } for (int i = 0; i < n - 1; i++) cout << res[i] << ' '; cout << res[n - 1] << endl; } return 0; }
n, k = [int(n) for n in input().split(' ')] attack, money = [int(n) for n in input().split(' ')], [int(n) for n in input().split(' ')] rank = sorted(attack, reverse=True) index = [attack.index(at) for at in rank] result = [] for i in range(n): ranking = rank.index(attack[i]) can_kill = n - ranking - 1 if can_kill >= k: result.append(str(sum([money[n] for n in index[ranking:ranking + k + 1]]))) else: result.append(str(sum([money[n] for n in index[ranking:]]))) print(' '.join(result))
#include <iostream> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int N = 1e5+5; struct node{ int stack; int money; int idx; }arr[N]; int n,k; vector<int> res; bool cmp(struct node a , struct node b){ return a.stack < b.stack; } int main(){ cin>>n>>k; res = vector<int>(n); for(int i = 0; i < n ;i++) cin>>arr[i].stack; for(int i = 0; i < n ;i++){ cin>>arr[i].money; arr[i].idx = i; } sort(arr, arr+n,cmp); //for(int i = 0; i < n ;i++) cout<<arr[i].stack<<" "<<arr[i].money<<endl; priority_queue<int,vector<int>,greater<int>> q; int s = 0; for(int i = 0 ; i < n ; i++){ int money = arr[i].money; int idx = arr[i].idx; s+=money; res[idx] = s; q.push(money); if(q.size() > k) { s = s-q.top(); q.pop(); } } for(int x : res) cout<<x<<" "; }