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;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值