• 【Codeforces 1106B】Lunar New Year and Food Ordering


    【链接】 我是链接,点我呀:)
    【题意】

    给你n个菜以及每个人需要的菜以及数量 如果某个人无法满足它对菜的需求的话 就用价格比较低的菜来填充它的要求。 (如果价格低的菜不够了,那么就直接输出0) 否则输出每个人的消费总量

    【题解】

    把所有的菜按照价格升序排序. 对于每一个顾客的kind,num 先减少菜的数量。 然后定义一个变量last 表示last之前的菜都已经售空(排序后,每个人可能会有多余的部分,要用前面最小的若干部分填充) 所以每个人都会让价格低的前面的一部分菜清空。 我们每次给某个顾客填充的时候,只要从那个零界点开始填充就好 然后不要一个订单一个订单(单个)的处理 而应该一个菜一个菜的遍历 这样复杂度才是线性的。

    【代码】

    import java.io.IOException;
    import java.util.Arrays;
    import java.util.Scanner;
    
    
    public class Main {
    	
    	static class Pair implements Comparable<Pair>{
    		int x,id;
    		
    		public Pair(int x,int id) {
    			this.x = x;this.id = id;
    		}
    
    		@Override
    		public int compareTo(Pair arg0) {
    			if (arg0.x==this.x)
    				return this.id-arg0.id;
    			else return this.x-arg0.x;
    		}
    		
    	}
    	
    	static int n,m;
    	static int rest[],Cost[],l[],r[];
    	static Pair a[];
    	
    	public static void main(String[] args) throws IOException{
    		// TODO Auto-generated method stub
    		Scanner in = new Scanner(System.in);
    		n = in.nextInt();m = in.nextInt();
    		rest = new int[n];
    		a = new Pair[n];
    		l = new int[n+10];
    		r = new int[n+10];
    		Cost = new int[n+10];
    		
    		for(int i = 0;i < n;i++) rest[i]= in.nextInt();
    		for (int i = 0;i < n;i++) {
    			a[i] = new Pair(0,i);
    			a[i].x = in.nextInt();
    			Cost[i] = a[i].x;
    		}
    		Arrays.sort(a);
    		int last = 0;
    		
    		for (int i = 1;i <= m;i++) {
    			long cost = 0;
    			int kind,num;
    			kind = in.nextInt();num = in.nextInt();
    			kind--;
    			int temp = Math.min(num, rest[kind]);
    			rest[kind]-=temp;
    			num-=temp;
    			cost += 1l*temp*Cost[kind];
    			
    			while(num>0 && last <n) {
    				temp = Math.min(num, rest[a[last].id]);
    				rest[a[last].id]-=temp;
    				num-=temp;
    				cost+=(long)1l*temp*Cost[a[last].id];
    				if (rest[a[last].id]==0) {
    					last++;
    				}
    			}
    			if (num!=0) cost = 0;
    			System.out.println(cost);
    		}
    	}
    
    }
    
  • 相关阅读:
    window.open 打开全屏窗口
    H5实现全屏与F11全屏
    泛型 总结
    java 反射
    静态工厂模式
    设计模式---单例模式
    String、List、array相互转换
    将数组转换成list
    将对象转换成json字符串的几种方式
    在map中放入数据时,如果key相同,会替换掉之前的相同key的数据
  • 原文地址:https://www.cnblogs.com/AWCXV/p/10351428.html
Copyright © 2020-2023  润新知