标签:hdu java bestcoder ac不止 保持ac的心态
4 1 3 1 2 1
3Hintif WLD deletes a 3, the numbers remain is [1,1,2],he‘ll get 2 different numbers. if WLD deletes a 2, the numbers remain is [1,1,3],he‘ll get 2 different numbers. if WLD deletes a 1, the numbers remain is [1,2,3],he‘ll get 3 different numbers.
1001 Delete 用一个cnt数组记下每个数在a序列中出现了几次 在删数的时候贪心,尽可能删那些出现次数>1的数 这样就可以使最后有最多不同的数
import java.io.*; import java.util.*; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); while(input.hasNext()) { int n = input.nextInt(); int a[] = new int[n]; //记录输入的数 int cnt[] = new int[n]; //记录每个数出现的次数 for(int i=0;i<n;i++) { a[i]=input.nextInt(); } int k =input.nextInt(); int j=0; //cnt数组计数器 Arrays.sort(a); for(int i=1;i<n;i++) //记录每个数出现的次数,按a[i]的从小到大排列 { if(a[i]==a[i-1]) { cnt[j]++; } else { j++; } } // System.out.println("j="+j); int temp[] = new int[j+1]; //创建一个j大小的数组为了实现快排,temp数组复制于cnt数组 for(int i=0;i<=j;i++) { temp[i]=cnt[i]; } Arrays.sort(temp); <span style="white-space:pre"> </span> //快速排序 int sum1=0; <span style="white-space:pre"> </span> //记录释放了几个相同数 int sum2=0; <span style="white-space:pre"> </span> //记录本身就不同的数! boolean flag = true; <span style="white-space:pre"> </span> //判断是否能够释放相同数 for(int i=0;i<=j;i++) { if(cnt[i]>0) { if(k>=cnt[i]) { k=k-cnt[i]; <span style="white-space:pre"> </span> sum1++; //释放了几个相同数 } else { flag=false; break; } } else { sum2++; //记录只有一个的数 } } if(flag) System.out.println(sum2-k+sum1); else { System.out.println(j+1); } } } }
wld有n个数(a1, a2, ...,an),他希望进行k次删除一个数的操作,使得最后剩下的n-k个数中有最多的不同的数,保证1 \leq n \leq 100,0 \leq k < n,1 \leq ai \leq n(对于任意1 \leq i \leq n)
多组数据(最多100组) 对于每组数据: 第一行:一个数n表示数的个数 接下来一行:n个数,依次为a1, a2, … ,an 接下来一行:一个数k表示操作数
对于每组数据: 输出最多剩下的不同的数的个数
4 1 3 1 2 1
3
如果删去第一个1: 在[3,1,2]中有3个不同的数 如果删去3: 在[1,1,2]中有2个不同的数 如果删去第二个1: 在[1,3,2]中有3个不同的数 如果删去2: 在[1,3,1]中有1个不同的数
标签:hdu java bestcoder ac不止 保持ac的心态
原文地址:http://blog.csdn.net/qq_16542775/article/details/45315935