参考代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

// 抓取卡牌
public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		String[] nxStrings = bf.readLine().trim().split("\\s+");
		
		int n = Integer.valueOf(nxStrings[0]);
		int x = Integer.valueOf(nxStrings[1]);
		int[][] nums = new int[n][4]; // 当前价值,基础价值,已用,剩余
		long valueSum = 0 ;  // 总价值
		
		String[] valueStrings = bf.readLine().trim().split("\\s+");
		String[] numStrings = bf.readLine().trim().split("\\s+");
		
		for(int i=0; i<n; i++) {
			nums[i][2] = 1;
			nums[i][3] = Integer.valueOf(numStrings[i]);
			if(nums[i][3]==0) {  // 如果卡牌数是0.直接把价值置为0
				nums[i][0] = 0;
				nums[i][1] = 0;
			}else {
				nums[i][0] = Integer.valueOf(valueStrings[i]);
				nums[i][1] = Integer.valueOf(valueStrings[i]);
			}
		}
		
		Arrays.sort(nums, (a,b)->{
			return b[0] - a[0];
		});
		
		while(true) {
			
			while(nums[0][0]>=nums[1][0] && x>0) {
				valueSum += nums[0][0];
				nums[0][2] += 1;
				nums[0][3] -= 1;
				
				if(nums[0][3]==0) {
					nums[0][0] = 0;
				}else {
					nums[0][0] = nums[0][1] / nums[0][2];
				}
				x--;
			}
			
			if(x<=0) break;
			
			int i=0;
			int j=1;
			while(j<nums.length && nums[i][0]<nums[j][0]) {
				int[] temp = nums[i];
				nums[i] = nums[j];
				nums[j] = temp;
				i++;
				j++;
			}
			
		}
		
		bf.close();
		System.out.println(valueSum);
		
	}

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论