有n只小熊,他们有着各不相同的战斗力。每次他们吃糖时,会按照战斗力来排,战斗力高的小熊拥有优先选择权。前面的小熊吃饱了,后面的小熊才能吃。每只小熊有一个饥饿值,每次进食的时候,小熊们会选择最大的能填饱自己当前饥饿值的那颗糖来吃,可能吃完没饱会重复上述过程,但不会选择吃撑。
现在给出n只小熊的战斗力和饥饿值,并且给出m颗糖能填饱的饥饿值。
求所有小熊进食完之后,每只小熊剩余的饥饿值。
第一行两个正整数n和m,分别表示小熊数量和糖的数量。(n <= 10, m <= 100) 第二行m个正整数,每个表示着颗糖能填充的饥饿值。 接下来的n行,每行2个正整数,分别代表每只小熊的战斗力和当前饥饿值。 题目中所有输入的数值小于等于100。
输出n行,每行一个整数,代表每只小熊剩余的饥饿值。
2 5 5 6 10 20 30 4 34 3 35
4 0
第一只小熊吃了第5颗糖 第二只小熊吃了第4颗糖 第二只小熊吃了第3颗糖 第二只小熊吃了第1颗糖
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Bear
{
int level;
int hungry;
int num;
};
bool func1(Bear a, Bear b)
{
if (a.level >= b.level)
return true;
else
return false;
}
bool func2(int a, int b)
{
if (a > b)
return true;
else
return false;
}
bool func3(Bear a, Bear b)
{
if (a.num < b.num)
return true;
else
return false;
}
int main(void)
{
int bearnum, candynum, itemp;
cin >> bearnum >> candynum;
vector<int> candy(candynum);
for (int i = 0; i < candynum; i++)
{
cin >> itemp;
candy[i] = itemp;
}
vector<Bear> bear(bearnum);
for (int i = 0; i < bearnum; i++)
{
Bear temp;
cin >> temp.level >> temp.hungry;
temp.num = i;
bear[i] = temp;
}
sort(bear.begin(), bear.end(), func1);
sort(candy.begin(), candy.end(), func2);
for (int i = 0; i < bearnum; i++)
{
int index = 0;
while (index < candynum)
{
if (bear[i].hungry >= candy[index])
{
bear[i].hungry = bear[i].hungry - candy[index];
candy[index] = 0;
}
index++;
}
}
sort(bear.begin(), bear.end(), func3);
for (auto c : bear)
{
cout << c.hungry << endl;
}
return 0;
} import java.util.*;
public class Main {
public static final int M_MAX = 105, N_MAX = 15;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), m = sc.nextInt();
int[] candies = new int[M_MAX];
for (int i=1; i<=m; i++) {
candies[i] = sc.nextInt();
}
Bear[] bears = new Bear[N_MAX];
for (int i=1; i<=n; i++) {
bears[i] = new Bear(i, sc.nextInt(), sc.nextInt());
}
Arrays.sort(candies, 1, m+1);
Arrays.sort(bears, 1, n+1,
(bear1, bear2) -> -Integer.compare(bear1.fightingValue, bear2.fightingValue));
for (int i=1; i<=n; i++) {
boolean flag;
do {
flag = false;
for (int j=m; j>0; j--) {
if (candies[j] != -1 && bears[i].hungryValue >= candies[j]) {
bears[i].hungryValue -= candies[j];
candies[j] = -1;
flag = true;
break;
}
}
}
while (flag);
}
Arrays.sort(bears, 1, n+1, (bear1, bear2) -> Integer.compare(bear1.No, bear2.No));
for (int i=1; i<=n; i++) {
System.out.println(bears[i].hungryValue);
}
return;
}
}
class Bear {
public void setHungryValue(int hungryValue) {
this.hungryValue = hungryValue;
}
public int No;
public int fightingValue;
public int hungryValue;
public Bear(int no, int fightingValue, int hungryValue) {
No = no;
this.fightingValue = fightingValue;
this.hungryValue = hungryValue;
}
}
n, m = map(int, input().strip().split()) hunger_fill = sorted(list(map(int, input().strip().split())), reverse=True) bears = [] for i in range(n): bears.append([i] +list(map(int, input().strip().split()))) bears = sorted(bears, key=lambda x: -x[1]) res = [] for bear in bears: hunger = bear[2] for i in range(m): if hunger_fill[i] == 0: break if hunger_fill[i] > 0 and hunger >= hunger_fill[i]: hunger -= hunger_fill[i] hunger_fill[i] = 0 res.append([bear[0], hunger]) hunger_fill = sorted(hunger_fill, reverse=True) res = sorted(res, key=lambda x: x[0]) for row in res: print(row[1])
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int beer_num = scanner.nextInt();
int suger_num = scanner.nextInt();
int [] suger = new int[suger_num];
for(int i=0;i<suger_num;i++){
suger[i] = scanner.nextInt();
}
int [][]beer = new int[beer_num][2]; // 熊属性
int []beer_2 = new int[beer_num]; // 记录熊的战斗力(因为后面排序会打乱位置)
for(int i=0;i<beer_num;i++){
beer[i][0] = scanner.nextInt();
beer[i][1] = scanner.nextInt();
beer_2[i] = beer[i][0];
}
scanner.close();
// 重写比较器--降序排列
Arrays.sort(beer, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0] == o2[0]) return o2[1] - o1[1];
return o2[0] - o1[0];
}
});
Arrays.sort(suger); // 升序(从后向前遍历)
// 改变熊的饥饿值
for(int []b : beer){
for(int i=suger_num-1;i>=0;i--){
if(b[1] >= suger[i]){
b[1] -= suger[i];
suger[i] = 0;
}
}
}
// 如果战斗力相同就输出(保证输出原先熊的顺序)
for(int b_2 : beer_2){
for(int[] b : beer){
if(b[0] == b_2){
System.out.println(b[1]);
}
}
}
}
} #include<bits/stdc++.h>
using namespace std;
int n, m;
int cd[100];
bool cd_used[100];
pair<int,int> atk_hry[10];
unordered_map<int, pair<int,int>&> mp;
bool cmp(const pair<int,int>& a, const pair<int,int>& b) {
return a.first >= b.first;
}
int main() {
cin >> n >> m;
for(int i=0;i<m;i++) {
cin >> cd[i];
cd_used[i] = false;
}
for(int i=0;i<n;i++) {
cin >> atk_hry[i].first >> atk_hry[i].second;
mp.insert(pair<int, pair<int,int>&>{i,atk_hry[i]});
}
sort(atk_hry, atk_hry+n, cmp);
sort(cd, cd+m, greater<int>());
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(cd_used[j] || cd[j]>atk_hry[i].second)
continue;
atk_hry[i].second -= cd[j];
cd_used[j] = true;
}
}
for(int i=0;i<n;i++) {
cout << mp.at(i).second << endl;
}
return 0;
} 如果自己写个带id的Bear类,然后输出之前按照id排序回来就可以通过:#include<bits/stdc++.h>
using namespace std;
int n, m;
int cd[100];
bool cd_used[100];
class Bear{
public:
int id;
int atk;
int hry;
};
Bear bear[10];
bool cmpAtk(const Bear& a, const Bear& b) {
return a.atk > b.atk;
}
bool cmpId(const Bear& a, const Bear& b) {
return a.id < b.id;
}
int main() {
cin >> n >> m;
for(int i=0;i<m;i++) {
cin >> cd[i];
cd_used[i] = false;
}
for(int i=0;i<n;i++) {
cin >> bear[i].atk >> bear[i].hry;
bear[i].id = i;
}
sort(bear, bear+n, cmpAtk);
sort(cd, cd+m, greater<int>());
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(cd_used[j] || cd[j]>bear[i].hry)
continue;
bear[i].hry -= cd[j];
cd_used[j] = true;
}
}
sort(bear, bear+n, cmpId);
for(int i=0;i<n;i++) {
cout << bear[i].hry << endl;
}
return 0;
} 请问我的第一种写法为什么不行呢?我的哈希表里的pair不是传引用的吗,难道说因为排序了,这个"引用"也会改变,就像传指针一样?def eatSugar(n, m, sugar, bear):
sugar = sorted(sugar, reverse = True)
for item in sorted(bear.items(), key = lambda x:x[1], reverse = True): # 按照字典value排序
for i in range(m):
if item[1][1] >= sugar[i]:
item[1][1] -= sugar[i]
sugar[i] = 0
for i in range(n): # 最终输出结果要求按最早熊的顺序
print(bear[i][1])
if __name__ == "__main__":
n, m = map(int, input().split())
sugar = list(map(int, input().split()))
bear = {}
for i in range(n):
k, v = map(int, input().split())
bear[i] = [k, v]
eatSugar(n, m, sugar, bear)
import java.util.Scanner;
import java.util.LinkedList;
import java.util.Iterator;
public class Main {
public static void main( String[] args ) {
class Bear {
int power; int hunger;
Bear( int p, int h ) { power = p; hunger = h; }
}
Scanner sc = new Scanner( System.in );
int n = sc.nextInt();
int m = sc.nextInt();
LinkedList<Integer> sugers = new LinkedList<>();
for( int i = 0; i < m; i ++ )
sugers.add( sc.nextInt() );
sugers.sort( (Integer i1, Integer i2) -> i2 - i1 );
LinkedList<Bear> bears = new LinkedList<>();
for( int i = 0; i < n; i ++ )
bears.add( new Bear( sc.nextInt(),sc.nextInt() ) );
LinkedList<Bear> bears_backup = new LinkedList<>();
bears_backup.addAll( bears );
bears.sort( ( Bear b1, Bear b2 )-> b2.power - b1.power );
for ( Bear bear: bears ){
Iterator<Integer> it = sugers.iterator();
while( it.hasNext() ) {
int tmp = it.next();
if( bear.hunger >= tmp ) {
bear.hunger -= tmp;
it.remove();
}
}
}
for( Bear bear : bears_backup ){
System.out.println( bear.hunger );
}
}
}
#include <bits/stdc++.h>
using namespace std;
struct P{ int id,a,b;
};
bool cmp1(int a, int b){ return a>b;
}
bool cmp2(P p1, P p2){ return p1.a>p2.a;
}
bool cmp3(P p1, P p2){ return p1.id<p2.id;
}
int main()
{ int n,m; while(cin>>n>>m){ int c[m]; for(int i=0;i<m;i++) cin>>c[i]; sort(c,c+m,cmp1); bool vis[m]; memset(vis,true,sizeof(vis)); P p[n]; for(int i=0;i<n;i++){ cin>>p[i].a>>p[i].b; p[i].id = i; } sort(p,p+n,cmp2); for(int i=0,cnt=0;i<n && cnt<m;i++) for(int j=0;j<m;j++) if(vis[j] && p[i].b>=c[j]){ p[i].b -= c[j]; vis[j] = false; cnt++; } sort(p,p+n,cmp3); for(int i=0;i<n;i++) cout<<p[i].b<<endl; } return 0;
} import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Scanner;
public class Main {
//熊类
public static class Bear {
int attack; //战斗力
int hungry; //饥饿值
public Bear(int attack, int hungry) {
this.attack = attack;
this.hungry = hungry;
}
}
//比较器,按战斗力逆序排行
public static class descComparator implements Comparator<Bear> {
public int compare(Bear p1, Bear p2) {
return p1.attack != p2.attack ? p2.attack - p1.attack : p1.hungry - p2.hungry;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
Bear[] pandas = new Bear[n];
int[] sugar = new int[m];
for (int i = 0; i < m; i++) {
sugar[i] = sc.nextInt();
}
//用哈希表保证最终结果能够不被排序打乱
HashMap<Integer, Bear> map = new HashMap<>();
for (int i = 0; i < n; i++) {
int attack = sc.nextInt();
int hungry = sc.nextInt();
pandas[i] = new Bear(attack, hungry);
map.put(i, pandas[i]);
}
//按战斗力排序熊类数组
Arrays.sort(pandas, new descComparator());
//按糖给的能量排序糖类数组
Arrays.sort(sugar);
for (int i = 0; i < n; i++) {
for (int j = m - 1; j >= 0; j--) {
if (sugar[j] != -1 && pandas[i].hungry - sugar[j] >= 0) {
pandas[i].hungry -= sugar[j];
sugar[j] = -1; //吃完糖将其置为-1
}
}
}
//打印结果
for (int i = 0; i < n; i++) {
System.out.println(map.get(i).hungry);
}
}
}
import java.util.Scanner;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] candy = new int[m];
for(int i=0;i<m;i++)
candy[i]=in.nextInt();
int[][] bears = new int[n][2];
Map<Integer,Integer> mapPos = new HashMap<>();
for(int i=0;i<n;i++){
bears[i][0] = in.nextInt();
bears[i][1] = in.nextInt();
mapPos.put(bears[i][0],i);
}
Arrays.sort(candy);
Arrays.sort(bears,(n1,n2)->n1[0]-n2[0]);
int[] res = new int[n];
for(int i=n-1;i>=0;i--){
for(int j=m-1;j>=0;j--){
if(bears[i][1]>=candy[j]){
bears[i][1]-=candy[j];
candy[j]=0;
}
}
res[mapPos.get(bears[i][0])] = bears[i][1];
}
for(int i=0;i<n;i++){
System.out.println(res[i]);
}
}
} import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
List<Integer> food = new LinkedList<>();
int n = in.nextInt(), m = in.nextInt();
for(int x = 0; x < m; x++) food.add(in.nextInt());
Comparator<int[]> comparator = (a, b) -> b[0] - a[0];
PriorityQueue<int[]> queue = new PriorityQueue<>(comparator);
for(int x = 0; x < n; x++){
int[] num = new int[3];
num[0] = in.nextInt();
num[1] = in.nextInt();
num[2] = x;
queue.offer(num);
}
Collections.sort(food);
int[] ans = new int[n];
for(int[] x : queue){
for(int y = food.size() - 1; y >= 0; y--){
if(x[1] - food.get(y) >= 0){
x[1] -= food.get(y);
food.remove(y);
}
if(x[1] == 0) break;
}
ans[x[2]] = x[1];
}
for(int x: ans) System.out.println(x);
}
} 兄弟们这为什么不对
import java.util.*;
import static java.util.Arrays.sort;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] a = new int[m];
Map<Integer,Integer> map = new TreeMap<>(Comparator.reverseOrder());
for (int i = 0; i < m; i++) {
a[i] = sc.nextInt();
}
sort(a);
for (int i = 0; i < n; i++) {
map.put(sc.nextInt(), sc.nextInt());
}
Set<Map.Entry<Integer, Integer>> entries = map.entrySet();
for (Map.Entry<Integer, Integer> en: entries) {
int value = en.getValue();
for (int i = m-1; i >=0 ; i--) {
if(value>=a[i] && a[i]!=0){
value-=a[i];
a[i] = 0;
}
}
System.out.println(value);
}
}
} const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function () {
var inp =(await readline()).split(' ')
var num=Number(inp[0])
var sug=Number(inp[1])
var suger=new Array(sug)
suger=(await readline()).split(' ')
suger=suger.map(Number)
suger.sort((a,b)=>a-b)
var bar=[]
while(num-->0){
tmp=(await readline()).split(' ')
tmp=tmp.map(Number)
bar.push(tmp)
}
var initBar=[].concat(bar)
bar.sort((a,b)=>b[0]-a[0])
for(let i=0;i<bar.length;i++){
for(let j=suger.length-1;j>=0;j--){
if(suger[j]<=bar[i][1]){
bar[i][1]-=suger[j]
suger.splice(j,1)
}
}
}
for(let i=0;i<initBar.length;i++){
for(let j=0;j<bar.length;j++){
if(initBar[i]==bar[j])
console.log(bar[j][1])
}
}
}()
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.Collections;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
// 创建内部类,封装三个属性
static class Panda {
int index;
int fight;
int eat;
public Panda(int index, int fight, int eat) {
this.index = index;
this.fight = fight;
this.eat = eat;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
//
int n = in.nextInt();
int m = in.nextInt();
List<Integer> mv = new ArrayList<>();
for (int i = 0; i < m; i++) {
mv.add( in.nextInt());
}
Collections.sort(mv, Collections.reverseOrder());
boolean[] loc = new boolean[m];
//
int[] fight = new int[n];
int[] eat = new int[n];
List<Panda> pandas = new ArrayList<>();
for (int i = 0; i < n; i++) {
fight[i] = in.nextInt();
eat[i] = in.nextInt();
pandas.add(new Panda(i, fight[i], eat[i]));
}
Collections.sort(pandas, new Comparator<Panda>() {
@Override
public int compare(Panda p1, Panda p2) {
// desc
return Integer.compare(p2.fight, p1.fight);
}
});
//
for (Panda p : pandas) {
int toEat = p.eat;
for (int i = 0; i < m; i++) {
if (toEat == 0) {
break;
}
int toGive = mv.get(i);
if (!loc[i] && toEat >= toGive) {
toEat -= toGive;
loc[i] = true;
}
}
eat[p.index] = toEat;
}
for (int i = 0; i < n; i++) {
System.out.println(eat[i]);
}
}
}
} n, m = list(map(int, input().split(" ")))
warh = {}
h = list(map(int, input().split(" ")))
for i in range(n):
warh[i] = list(map(int, input().split(" ")))
ls = sorted(warh.items(), key=lambda x:x[1], reverse=True)
# 按战斗值排序后,去掉战斗值,第一列为第几只熊,第二列为饥饿值
wh = [[] for _ in range(n)]
for i in range(n):
wh[i] = [ls[i][0], ls[i][1][1]]
h.sort(reverse=True)
res = [0] * n
eat = [False] * m
for i in range(n):
for j in range(m):
if not eat[j]: # 糖不能重复吃
if wh[i][1] - h[j] > 0:
wh[i][1] -= h[j]
eat[j] = True
elif wh[i][1] - h[j] == 0:
wh[i][1] = 0
eat[j] = True
break
else:
res[wh[i][0]] = wh[i][1]
for i in range(n):
print(res[i]) import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
ArrayList<Integer> arrm = new ArrayList<Integer>();
for(int i=0;i<m;i++){
arrm.add(sc.nextInt());//保存糖果能量
}
int[][] arrn = new int[n][3];
for(int i=0;i<n;i++){
arrn[i][0] = sc.nextInt();//战斗力
arrn[i][1] = sc.nextInt();//饥饿值
arrn[i][2] = i;//出场顺序
}
Collections.sort(arrm);//按糖果能量排序
Arrays.sort(arrn,(o1,o2)->o2[0]-o1[0]);//按战斗力排序
for(int i=0;i<n;i++){
int j = arrm.size()-1;
while(arrn[i][1]>=arrm.get(0)){//尽量填饱
if(arrm.get(j)<=arrn[i][1]){
arrn[i][1]-=arrm.get(j);
arrm.remove(j);
}
j--;
}
}
Arrays.sort(arrn,(o1,o2)->o1[2]-o2[2]);//按序输出
for(int i=0;i<n;i++){
System.out.println(arrn[i][1]);
}
}
} import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// 小熊数量
int n = input.nextInt();
// 糖果数量
int m = input.nextInt();
int[] sugar = new int[m];
// 小熊集合
Map<Integer, Integer> bear = new HashMap<>();
// 记录原来小熊的顺序
Map<Integer, Integer> map = new HashMap<>();
// 输入糖果能量值
for (int i = 0; i < m; i++) {
sugar[i] = input.nextInt();
}
// 输入小熊战斗力与饥饿值
for (int i = 0; i < n; i++) {
int power = input.nextInt();
int hunger = input.nextInt();
bear.put(power, hunger);
// 因为战斗力不变,所以value是power,其实这里的value可以换成bear更好,不过要定义bear类而不是bear的hashmap
map.put(i, power);
}
// 对糖果能量值升序排序
Arrays.sort(sugar);
// 按power降序排序小熊集合
List<Map.Entry<Integer, Integer>> list = new ArrayList<>(bear.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
// 降序排序
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o2.getKey().compareTo(o1.getKey());
}
});
// 小熊吃糖果,先吃大的糖果,并且 糖果能量值 <= 饥饿值 才能吃
for (Map.Entry<Integer, Integer> entry : list) {
for (int i = m - 1; i >= 0; i--) {
if (entry.getValue() >= sugar[i] && sugar[i] >= 0) {
entry.setValue(entry.getValue() - sugar[i]);
sugar[i] = -1; // 该糖果被吃了
}
}
}
// 按原来顺序输出
for (int i = 0; i <n ; i++) {
System.out.println(bear.get(map.get(i)));
}
}
} def search_max_value_no_larger_than_hunger(nums, target): l, r = 0, len(nums) - 1 while l < r: m = (l + r + 1) // 2 if nums[m] > target: r = m - 1 elif nums[m] == target: return m else: l = m return r def supply_sugar(nums, target): while True: i = search_max_value_no_larger_than_hunger(nums, target) if i == -1: break else: if nums[i] > target: break target -= nums[i] nums.remove(nums[i]) if target == 0: return 0 return target n, m = [int(i) for i in input().split()] energies = list(map(int, input().split())) energies.sort() bearS, bearH = [], [] for i in range(n): strength, hunger = [int(i) for i in input().split()] bearS.append(strength) bearH.append(hunger) info = sorted(enumerate(bearS), key=lambda x: x[1], reverse=True) idxes = [i[0] for i in info] for i in idxes: bearH[i] = supply_sugar(energies, bearH[i]) for i in range(n): print(bearH[i])
import sys
p, d = list(map(lambda line: list(map(int, line.split())), sys.stdin)), {}
p[1].sort(reverse=True)
for i in range(2, p[0][0] + 2): d[p[i][0]] = p[i][1]
for k in sorted(d, reverse=True):
i = 0
while i < len(p[1]):
if p[1][i] > d[k]: i += 1
else:
d[k] -= p[1][i]
del p[1][i]
for i in range(2, p[0][0] + 2): print(d[p[i][0]])