• poj1696


    题意:给定一些点,找一条路径,要求经过点最多,并且不能相交。。。

    思路:可以用极角排序,但是实际上就是凸包的变形。。套用凸包模板即可。。

    code:

     1 /*
     2   Time:2013-03-26 18:22:16
     3   State:Accepted
     4 */
     5 #include<iostream>
     6 #include<cstring>
     7 #include<cstdlib>
     8 #include<cmath>
     9 #include<algorithm>
    10 #include<cstdio>
    11 #include<string>
    12 using namespace std;
    13 struct oo{int x , y , p;};
    14 int M,n;
    15 oo a[1500], pa;
    16 
    17 void init(){
    18      scanf("%d", &n );
    19      for (int i = 0; i < n; ++i)
    20            scanf("%d%d%d",&a[i].p, &a[i].x , &a[i].y);
    21 }
    22 
    23 bool cmp(const oo a, const oo b){
    24      if (a.y < b.y || a.y == b.y && a.x < b.x) return true;
    25      return false;
    26 }
    27 
    28 bool cmpx(const oo a, const oo b){
    29     int x1 = a.x - pa.x;
    30     int x2 = b.x - pa.x;
    31     int y1 = a.y - pa.y;
    32     int y2 = b.y - pa.y;
    33     if (x1*y2 -x2*y1 >0) return 1;
    34     if (x1*y2 - x2*y1 == 0 && 
    35     x1*x1 + y1*y1 < x2*x2 + y2* y2) return 1;
    36     return 0;
    37 }
    38 
    39 void solve(){
    40      sort(a, a + n, cmp);  
    41      for (int i = 0; i < n - 1; ++i){
    42          pa = a[i];
    43          sort(a + i + 1, a + n, cmpx );
    44      }
    45      printf("%d ", n);
    46      for (int i = 0;  i < n; ++i)
    47           printf("%d ",a[i].p);
    48     
    49  printf("\n");
    50 }
    51 
    52 int main(){
    53     freopen("poj1696.in","r", stdin);
    54     freopen("poj1696.out","w",stdout);
    55     scanf("%d",&M);
    56     while (M--){
    57        init();
    58        solve();
    59     }
    60     fclose(stdin); fclose(stdout);
    61 }
  • 相关阅读:
    cuda thrust函数首次调用耗费时间比后续调用长原因
    poj2823/hdu3415
    hiho1515
    hiho147周
    hdu1864/2844/2159 背包基础题
    qt + opencv
    Matlab函数编译成dll供c调用
    无处不在的编程思想
    五步使用法——搞定XMLHttpRequest
    AJAX与传统Web开发比较
  • 原文地址:https://www.cnblogs.com/yzcstc/p/3015668.html
Copyright © 2020-2023  润新知