生活随笔
收集整理的這篇文章主要介紹了
codeforces 521div3(D Cutting Out)java
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接
測試用例:
很多情況會一直wa是因為題意沒用讀懂,進入自己的圈子無限wa,氣的記錄下來。。下次不能這么天真。
題意:給數(shù)字n和k,n是數(shù)字串的長度,k是要將數(shù)字分成的份數(shù)。讓這么多份的數(shù)字出現(xiàn)次數(shù)最多。
思路:
①首先說說我的錯誤思路,我想到將數(shù)字預處理,先將數(shù)字按照出現(xiàn)的次數(shù)排序,提取前K個。那么最壞的情況就是這K種都取。出現(xiàn)的次數(shù)最大為此時第k個數(shù)出現(xiàn)的次數(shù)(這是最壞的情況)。我剛開始認為出現(xiàn)最小的次數(shù)就是排序中value最小的那個。出現(xiàn)最大次數(shù)的可能性就是第一出現(xiàn)的次數(shù),后來發(fā)現(xiàn)我的想法是錯誤,舉個例子:測試數(shù)據(jù)1 1 1 1 1 1 2 2 2 2 2 2,k=3的時候,數(shù)值的種類還沒三總。只是對應1:5次,2:5次。然而結果是1 1 1 2 2,出現(xiàn)兩次。看來次數(shù)跟最小出現(xiàn)次數(shù)沒關系呢。要從頭開始遍歷呢。
②:看數(shù)據(jù)范圍,,如果要求不多勉強可以暴力,數(shù)據(jù)范圍也在二分的范圍內。然后看了其他大佬的教程,清一色二分。。我先用了沒有二分的方法過。然后加上二分。
沒有二分處理思想為:設初始出現(xiàn)的次數(shù)q=1為一次開始遍歷??偪赡艹霈F(xiàn)次數(shù)(模擬的K)一旦超過k停止當前循環(huán)。記錄次數(shù),這就是目前的最大次數(shù)。然后次數(shù)遞增遍歷直到count小于K停止次數(shù)的遞增。然后再遍歷list每個元素,除以出現(xiàn)的次數(shù)。直到總和為k次 。
二分:二分就是對次數(shù)進行二分。最大可能的次數(shù)為第一個出現(xiàn)的次數(shù)(不可能超過)。所以就left,right再1和max中二分查找。
可能是數(shù)據(jù)不太強,二分只比第一次快了一點點。但是這題的思想還是二分 排序處理。
附上二分代碼(202ms):
package codeforces521
;import java
.io
.BufferedReader
;
import java
.io
.IOException
;
import java
.io
.InputStreamReader
;
import java
.io
.OutputStreamWriter
;
import java
.io
.PrintWriter
;
import java
.io
.StreamTokenizer
;
import java
.util
.ArrayList
;
import java
.util
.Comparator
;import java
.util
.List
;
public class testD {public static void main(String
[] args
) throws IOException
{StreamTokenizer in
=new StreamTokenizer(new BufferedReader(new InputStreamReader(System
.in
)));PrintWriter out
= new PrintWriter(new OutputStreamWriter(System
.out
));in
.nextToken();int n
=(int)in
.nval
;in
.nextToken();int k
=(int)in
.nval
;int a
[]=new int[n
];int map2
[]=new int[200005];for(int i
=0;i
<n
;i
++){in
.nextToken();a
[i
]=(int)in
.nval
;map2
[a
[i
]]++;}List
<node>list
=new ArrayList<>();for(int i
=0;i
<200005;i
++){if(map2
[i
]>0){node no
=new node(i
, map2
[i
]);list
.add(no
);}}list
.sort(com
);int max
=list
.get(0).value
;int value
=0;int mid
=0;
for(int q
=1;q
<=max
;q
++){int count
=0;for(int i
=0;i
<list
.size();i
++){count
+=list
.get(i
).value
/q
;if(count
>=k
){value
=i
;mid
=q
;break;} }if(count
<k
){break;}}int time
=0;for(int i
=0;i
<list
.size();i
++){node team
=list
.get(i
);int va
=team
.value
;while(va
-mid
>=0){va
-=mid
;time
++;if(time
>k
) {break;}out
.print(team
.index
+" ");}if(time
>k
)break;}out
.flush(); }static Comparator
<node>com
=new Comparator<node>() {@Overridepublic int compare(node o1
, node o2
) {return o2
.value
-o1
.value
;} };static class node{int index
;int value
;public node() {}public node(int index
,int value
){this.index
=index
;this.value
=value
;}}}
如果對后端、爬蟲、數(shù)據(jù)結構算法等感性趣歡迎關注我的個人公眾號交流:bigsai
《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的codeforces 521div3(D Cutting Out)java的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。