当前位置:   article > 正文

codeforces 1477 C. Nezzar and Nice Beatmap

codeforces 1477

https://codeforces.com/contest/1477/problem/C

可以从一个点开始每次找最远点,证明只能脑补一下。。。

还有各种乱搞代码

这里有份随机代码,他还证明了期望两次随机得到正确的排列

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef struct{
  4. long long xz;
  5. long long yz;
  6. }point;
  7. point vector_plus(point a,point b){
  8. point r;
  9. r.xz=a.xz+b.xz;
  10. r.yz=a.yz+b.yz;
  11. return r;
  12. }
  13. point vector_minus(point a,point b){
  14. point r;
  15. r.xz=a.xz-b.xz;
  16. r.yz=a.yz-b.yz;
  17. return r;
  18. }
  19. //naiseki
  20. long long dotproduct(point a,point b){
  21. return a.xz*b.xz+a.yz*b.yz;
  22. }
  23. //gaiseki
  24. long long crossproduct(point a,point b){
  25. return a.xz*b.yz-a.yz*b.xz;
  26. }
  27. int main(){
  28. std::random_device seed_gen;
  29. std::mt19937 engine(seed_gen());
  30. ios::sync_with_stdio(false);
  31. std::cin.tie(nullptr);
  32. int n;
  33. cin >> n;
  34. vector<point> pt(n);
  35. for(int i=0;i<n;i++){cin >> pt[i].xz >> pt[i].yz;}
  36. vector<int> p(n);
  37. for(int i=0;i<n;i++){p[i]=i;}
  38. while(1){
  39. shuffle(p.begin(),p.end(),engine);
  40. for(int i=2;i<(n-1);i++){
  41. for(int j=i;j<n;j++){
  42. swap(p[i],p[j]);
  43. if(dotproduct(vector_minus(pt[p[i-2]],pt[p[i-1]]),vector_minus(pt[p[i-1]],pt[p[i]]))<0){
  44. break;
  45. }
  46. }
  47. }
  48. int fl=1;
  49. for(int i=2;i<n;i++){
  50. if(dotproduct(vector_minus(pt[p[i-2]],pt[p[i-1]]),vector_minus(pt[p[i-1]],pt[p[i]]))>=0){
  51. fl=0;break;
  52. }
  53. }
  54. if(fl==1){break;}
  55. }
  56. for(int i=0;i<n;i++){
  57. if(i){cout << ' ';}
  58. cout << p[i]+1;
  59. }
  60. return 0;
  61. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/75414
推荐阅读
相关标签
  

闽ICP备14008679号