Delete
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 329 Accepted Submission(s): 197
For each case:
The first line contains one integer N(0<N≤100) .
The second line contains N integers a1,a2,...,aN(1≤ai≤N) , denoting the integers WLD plays with.
The third line contains one integer K(0≤K<N) .
Print one integer. It denotes the maximum of different numbers remain after the deletion.
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.
以上是题目,就是给你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;
}