1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. //暴力破解 时间超限55%
  6. // int n;
  7. // cin>>n;
  8. // int p[n];
  9. // for(int i=0;i<n;i++){
  10. // cin>>p[i];
  11. // for(int j=0;j<i;j++){
  12. // if(p[i]==p[j]){
  13. // p[i]++;
  14. // j=-1;
  15. // }
  16. // if(j==i-1){
  17. // break;
  18. // }
  19. // }
  20. // cout<<p[i]<<" ";
  21. // }
  22. //使用类似于散列表的做法,在定义一个数组,用来存储被访问过的,时间超限18%
  23. // int v[1000099];
  24. // for(int i=0;i<1000099;i++){
  25. // v[i]=0;
  26. // }
  27. // int n;
  28. // cin>>n;
  29. // int *p=new int[n];
  30. // for(int i=0;i<n;i++){
  31. // cin>>p[i];
  32. // while(1){
  33. // if(v[p[i]]==1){//说明被访问过
  34. // p[i]++;
  35. // }else{//没有被访问过的,就赋予1
  36. // v[p[i]]=1;
  37. // break;
  38. // }
  39. // }
  40. // cout<<p[i]<<" ";
  41. // }
  42. //优化上面的算法
  43. int v[1000099];//存储每次访问的次数
  44. for(int i=0;i<1000099;i++){
  45. v[i]=0;
  46. }
  47. int n;
  48. cin>>n;
  49. int *p=new int[n];
  50. for(int i=0;i<n;i++){
  51. cin>>p[i];
  52. while(1){
  53. if(v[p[i]]!=0){//说明被访问过了,p[i]=他自身加上他访问过的次数,同时这个数的访问次数要+1
  54. v[p[i]]++;
  55. p[i]+=v[p[i]]-1;
  56. }else{//没有被访问过的,就自加1
  57. v[p[i]]++;
  58. break;
  59. }
  60. }
  61. }
  62. for(int i=0;i<n;i++){
  63. cout<<p[i]<<" ";
  64. }
  65. return 0;
  66. }
点赞(0)
 

0 分

0 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论