杭电1789贪心java实现
題意:
問題描述
伊格內修斯有很多功課要做。每個老師都會給他一個交作業的截止日期。如果在截止日期之后提交作業,老師會減少他的最終考試成績。現在我們假設每個人做功課都需要一天的時間。所以希望你幫助他安排作業的次序,以盡量減少分數。
輸入
輸入包含多個測試用例。輸入的第一行是一個整數T,即測試用例的數量。 T測試用例如下。
每個測試用例都以一個表示作業數量的正整數N(1 <= N <= 1000)開始。然后是2行。第一行包含N個表示主題最后期限的整數,下一行包含N個表示分數降低的整數。
產量
對于每個測試用例,您應輸出最小的總體縮減分數,每個測試用例一行。
示例輸入
3
3
3 3 3
10 5 1
3
1 3 1
6 2 3
7
1 4 6 4 2 4 3
3 2 1 7 6 5 4
?
示例輸出
0
3
5
分析,可在意識到這是一種貪心算法,但是要考慮貪心的策略。有按照截至日期排序和扣的分數排序。可以從扣的分數排序思考。將扣的分數從大到小排序。用數組c【】足夠大表示第幾天完成的內容的所值分數。有n組數據看最后一組數據分析:最后一組數據排序后為:
7 6 5 4 3 2 1
4 2 4 3 1 4 6
正常情況:
最大的那個一定要在四天前完成,他的價值最大,為了最大化利用資源就讓他在第四天完成,那么c[4]=7;
第二個6 2,同理在第二天完成。
特殊情況:
第三組數據5 4.因為c[4]已經被用過,并且用過的那個數據價值一定比當前5價值高,所以可以從第四天不行,就讓他的前一天完成這組數據,即c[3]=5(你可能會問遇到第三天恰好完成的怎么辦,首先有兩點,第一:后面第三天的分數就算沒位置舍棄價值也比舍棄這個數據價值大。第二:第三天恰好完成的可以看看第二天,第一天有沒有被占用,如果有空,那么就從第三天往前查找遍歷,入座。如果沒有空值,可以肯定前面的值都比第三天貴很多,不劃算舍棄,所以當到第0個位置都沒有座位,就是必須要犧牲的。)
這種方式就是最大化減小扣的分數。
代碼如下:
import java.util.Scanner;public class 杭電1789 {public static void main(String[] args) {Scanner sc=new Scanner(System.in);int T=sc.nextInt();for(int TT=0;TT<T;TT++){int num=0;int n=sc.nextInt();//功課數量int a[]=new int[n];//最后期限int b[]=new int[n];//降分數int c[]=new int[10000];boolean[] d=new boolean[n];for(int i=0;i<n;i++){a[i]=sc.nextInt(); }for(int i=0;i<n;i++){b[i]=sc.nextInt();}for(int i=0;i<n;i++)//按照截至日期升序{for(int j=i;j<n;j++){if(b[i]<b[j]){int tem=a[i];a[i]=a[j];a[j]=tem;tem=b[i];b[i]=b[j];b[j]=tem;}if(b[j]==b[i]&&a[i]>a[j])//相同日期大的在左邊,大的要先交{int tem=b[i];b[i]=b[j];b[j]=tem;}}}for(int i=0;i<n;i++)//對數據逐個處理{if(c[a[i]-1]==0) {c[a[i]-1]=b[i];}//正常情況。注意數組有c[0];對應的是第一天else if(c[a[i]-1]!=0)//特殊情況{for(int j=a[i]-1;j>=0;j--){if(c[j]==0) {c[j]=b[i];break;}else if(j==0&&c[0]!=0) {num=num+b[i];}//在他之前沒位置,在座的都比他貴,只能舍棄了}}}System.out.println(num);}} }?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的杭电1789贪心java实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杭电oj1257最少拦截系统—贪心/dp
- 下一篇: 杭电oj2072,2091字符串java