奖学金问题-贪心解决

奖学金

http://www.nowcoder.com/questionTerminal/cee98a512ec246a2918ea8121f7612c8

大概思路:遇到极值问题一般想到贪心解决,这里很容易想到按课程复习代价从小到大排序,贪心的证明用反证法证明即可。
个人踩雷:
1 输入有多个测试样例,需要Scanner.hasNext();
2 看测试数据的范围,可以看出int不够大,需要使用long。

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int n=sc.nextInt();
        int full=sc.nextInt();
        int avg=sc.nextInt();
        int[][] nums=new int[n][2];
        for(int i=0;i<n;i++){
            nums[i][0]=sc.nextInt();
            nums[i][1]=sc.nextInt();
        }
        Arrays.sort(nums,(o1,o2)->o1[1]-o2[1]);//按复习代价从小到大排序
        long sum=0;
        for(int[] a:nums) {
            sum+=a[0];
        }
        long limit=avg*n;
        int index=0;
        long time=0;
        while(sum<limit){
            int tmp=full-nums[index][0];
            if(tmp+sum<=limit){                  //如果一门课程复习到满分,小于限制,
                time+=tmp*nums[index][1];
                sum+=tmp;
                index++;
            }
            else{                              //如果一门课程复习到满分,大于限制,
                time+=(limit-sum)*nums[index][1];
                sum=limit;
            }  
        }
        System.out.println(time); 
        }
    }
}
全部评论

相关推荐

12 1 评论
分享
牛客网
牛客企业服务