hdu 5210


Delete

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 329    Accepted Submission(s): 197


Problem Description
WLD likes playing with numbers. One day he is playing with N integers. He wants to delete K integers from them. He likes diversity, so he wants to keep the kinds of different integers as many as possible after the deletion. But he is busy pushing, can you help him?
 

Input
There are Multiple Cases. (At MOST 100)

For each case:

The first line contains one integer N(0<N100).

The second line contains N integers a1,a2,...,aN(1aiN), denoting the integers WLD plays with.

The third line contains one integer K(0K<N).
 

Output
For each case:

Print one integer. It denotes the maximum of different numbers remain after the deletion.
 

Sample Input
4 1 3 1 2 1
 

Sample Output
3
Hint
if 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.
 

Source
 
 

以上是题目,就是给你n个数要你删掉k个,让剩下的数不相同最多。那就是找到能删掉而不影响最大的答案的有几个,就是找出有多少个是前面已经有了的,而如果k比能删的重复数的数目的总和还大,就从n-sum之后再删,就是删不同的数,这时候不同数的数目就变了,输出答案即可。不知为何竟然错了,难道是因为没有memset?可是我在后来直接定义数组的呀。。不过现在ac了。这道题我在想,要是数据特别多特别大怎么算呢,当时就想到map,但是map我不会用。。等会儿我去百度百度吧。

#include<iostream>

#include<cstdio>
#include<cstring>
using namespace std;
#define maxx 105 
int a[maxx];
int main()
{
int n;


while(cin>>n)//忽然在想要是n的输入是“邪恶的” ,那该怎么判断规避,还是现在这样是不用的呢 
{

memset(a,0,sizeof(a));
int sum=0,k,ans=0,x;//sum代表有几个不一样的数 
//ans代表最终输出,k代表输入的k值,x用来存每次输入的数。n代表输入有几个数
int i=n;
while(i--)
{
//scanf("%d",&x);
cin>>x;
if(!a[x])
{
sum+=1;
}
a[x]+=1;
}
cin>>k;
if(n-sum>=k)
printf("%d\n",sum);//其实之前一直习惯于cin、cout。不过printf什么的更快,想习惯改成这样。 
else
{
//printf("%d\n",sum1+sum2-k);
cout<<n-k<<endl;
}


return 0;




//=============接下来是原来的代码,试了试发现问题在于memset。。但是我明明是输入n之后才定义的数组a啊怎么就不行呢。==========================

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int a[105],k,sum=0,x;
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
{
cin>>x;
if(a[x]!=1)//就算只有一行代码,也要有花括号,要写得规范,便于阅读。 
{
a[x]=1;
}
else 
{
sum+=1;
}
}
cin>>k;
if(sum>=k)
{
printf("%d\n",n-sum);
}
else 
{
printf("%d\n",n-k);
}

}
return 0;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章