wenbao与cf(849D)思维

 

http://codeforces.com/contest/848/problem/B

 

 

 

 

考虑会碰到的条件,X+Y相等,贪心

 

 1 #include <iostream>
 2 #include <string.h>
 3 #include <vector>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int maxn = 100009;
 8 int g[maxn], p[maxn], t[maxn], n, w, h, x[maxn], y[maxn], co_x[maxn], co_y[maxn];
 9 vector<int> v[maxn*2];
10 
11 bool cmp(int x, int y){
12     if(g[x] != g[y]) return g[x] == 2;
13     else{
14         if(g[x] == 1) return p[x] < p[y];
15         else return p[x] > p[y];
16     }
17 }
18 
19 int main(){
20     scanf("%d%d%d", &n, &w, &h);
21     for(int i = 0; i < n; ++i){
22         scanf("%d%d%d", &g[i], &p[i], &t[i]);
23         v[p[i]-t[i]+maxn].push_back(i);
24     }
25     for(int i = 0; i < maxn*2; ++i){
26         int numx = 0, numy = 0;
27         for(int j = 0; j < v[i].size(); ++j){
28             int xx = v[i][j];
29             if(g[xx] == 1) x[numx++] = p[xx];
30             else y[numy++] = p[xx];
31         }
32         sort(x, x+numx);
33         sort(y, y+numy);
34         sort(v[i].begin(), v[i].end(), cmp);
35         for(int j = 0; j < numx; ++j){
36             co_x[v[i][j]] = x[j];
37             co_y[v[i][j]] = h;
38         }
39         for(int j = 0; j < numy; ++j){
40             co_x[v[i][numx+j]] = w;
41             co_y[v[i][numx+j]] = y[numy-j-1];
42         }
43     }
44     for(int i = 0; i < n; ++i){
45         printf("%d %d\n", co_x[i], co_y[i]);
46     }
47     return 0;
48 }

 

 

 看到别人博客里面提供了另外一种思路,可以将起点和终点排序必然是一一对应的

 

 

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 const int maxn = 100009;
 6 struct Node{
 7     int x, y, xx, yy, id;
 8 };
 9 
10 Node a[maxn], b[maxn];
11 int co_x[maxn], co_y[maxn];
12 
13 int main(){
14     int n, w, h, g, p, t;
15     scanf("%d%d%d", &n, &w, &h);
16     for(int i = 0; i < n; ++i){
17         scanf("%d%d%d", &g, &p, &t);
18         if(g == 1){
19             a[i] = (Node){p, -t, p, h, i};
20         }else{
21             a[i] = (Node){-t, p, w, p, i};
22         }
23         b[i] = a[i];
24     }
25     //N1.x+N1.y == N2.x+N2.y 可以相撞
26     sort(a, a+n, [](Node N1, Node N2){
27         return (N1.x+N1.y < N2.x+N2.y || N1.x+N1.y == N2.x+N2.y && N1.x-N1.y < N2.x-N2.y);
28     });
29     sort(b, b+n, [](Node N1, Node N2){
30         return (N1.x+N1.y < N2.x+N2.y || N1.x+N1.y == N2.x+N2.y && N1.xx-N1.yy < N2.xx-N2.yy);
31     });
32     for(int i = 0; i < n; ++i){
33         co_x[a[i].id] = b[i].xx;
34         co_y[a[i].id] = b[i].yy;
35     }
36     for(int i = 0; i < n; ++i){
37         printf("%d %d\n", co_x[i], co_y[i]);
38     }
39     return 0;
40 }

 

 

 

 

只有不断学习才能进步!

 

posted @ 2018-04-14 13:47  wenbao  阅读(143)  评论(0编辑  收藏  举报