[关闭]
@Metralix 2016-10-17T08:01:22.000000Z 字数 572 阅读 796

D


这题探究将一个数组中的数置换多少次,可以成一个1~n的全排列。首先数组中超过n的数肯定要被置换,我将其记录为t个。然后将这个数组由小到大排列,那么前n-t个项都是合法的数字,将这些数字遍历一遍,记录其中不同的数为cou,这些数不用置换,后t个数全部置换
那么最终需要置换的数为n-cou。

值得注意的是当t=n,即所有数都不合法时,前面的循环条件会出现一个bug,把这种情况单独领出来即可。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int n,i,cou=0,d=0,j,t=0;
  6. int a[5000];
  7. scanf("%d",&n);
  8. //if(n=1)
  9. for(i=0;i<n;i++)
  10. scanf("%d",&a[i]);
  11. for(i=0;i<n;i++)
  12. {
  13. if(a[i]>n)
  14. {
  15. a[i]=0;
  16. t++;
  17. }
  18. }
  19. for(i=0;i<n-1;i++)
  20. {
  21. for(j=i+1;j<n;j++)
  22. {
  23. if(a[i]<a[j])
  24. {
  25. int temp;
  26. temp=a[i];
  27. a[i]=a[j];
  28. a[j]=temp;
  29. }
  30. }
  31. }
  32. for(i=0;i<n-1-t;i++)
  33. {
  34. if(a[i+1]!=a[i])
  35. {
  36. cou++;
  37. }
  38. }
  39. if(t==n)
  40. printf("%d",n-cou);
  41. else printf("%d",n-cou-1);
  42. return 0;
  43. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注