西部世界中有个赏金猎人,每个赏金猎人都有两个属性战斗力和所拥有金钱。(
分别表示第
个赏金猎人的战斗力和所拥有金钱,保证每个赏金猎人的战斗力不相同)。每一个赏金猎人只有
发子弹,这意味着他最多可以击败
个战斗力比他小的赏金猎人并获取他们的金钱。你能输出每一个赏金猎人最多拥有多少金钱
西部世界中有个赏金猎人,每个赏金猎人都有两个属性战斗力和所拥有金钱。(
分别表示第
个赏金猎人的战斗力和所拥有金钱,保证每个赏金猎人的战斗力不相同)。每一个赏金猎人只有
发子弹,这意味着他最多可以击败
个战斗力比他小的赏金猎人并获取他们的金钱。你能输出每一个赏金猎人最多拥有多少金钱
第一行包含两个整数。
第二行包含个整数
。
第三行包含个整数
。
输出一行包含个整数,第
个整数表示第
个赏金猎人最多拥有金钱数。
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<<" ";
}