这次的题好奇怪哦。。。
思路:先把跟停车位相邻的车停进去,然后开始转圈。。。
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define pii pair<int, int> using namespace std; const int N = 20007; const int M = 1e6 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 +7; int a[4][N], n, k; vector<int> ans[3]; pii getPos(int id) { if (id < n) return mk(1, id); else return mk(2, 2 * n - 1 - id); } void add(int x, int y, int z) { ans[0].push_back(x); ans[1].push_back(y); ans[2].push_back(z); } int main() { scanf("%d%d", &n, &k); for(int i = 0; i < 4; i++) { for(int j = 0; j < n; j++) { scanf("%d", &a[i][j]); } } for(int j = 0; j < n; j++) { if(a[0][j] == 0) continue; if(a[0][j] == a[1][j]) { add(a[0][j], 0, j); k--; a[1][j] = 0; } } for(int j = 0; j < n; j++) { if(a[3][j] == 0) continue; if(a[3][j] == a[2][j]) { add(a[3][j], 3, j); k--; a[2][j] = 0; } } if(k == 2 * n) { puts("-1"); return 0; } while(k > 0) { for(int i = 0; i < 2 * n; i++) { pii u = getPos(i); if(a[u.first][u.second] == 0) continue; if(a[u.first ^ 1][u.second] == a[u.first][u.second]) { add(a[u.first][u.second], u.first ^ 1, u.second); k--; a[u.first][u.second] = 0; continue; } pii v = getPos((i + 2 * n - 1) % (2 * n)); if(a[v.first][v.second] != 0) continue; add(a[u.first][u.second], v.first, v.second); swap(a[u.first][u.second], a[v.first][v.second]); } } printf("%d ", ans[0].size()); for(int i = 0; i < ans[0].size(); i++) { printf("%d %d %d ", ans[0][i], ans[1][i] + 1, ans[2][i] + 1); } return 0; }
E:
题目大意:给你n个长度小于1e6的向量,让你把每个向量变成正向或者负向,使得所有向量加起来的长度不超过1.5 * 1e6
思路:正解是每三个向量中都能找到两个向量合起来 <= 1e6,然后不断合并,最后只会剩下一个或者两个向量,
如果一个向量肯定 <= 1e6, 如果是两个向量一定 <= 1.5 * 1e6。。。
但是可以用随机洗牌的方法去贪心,因为能卡掉的数据特别不好造。。。
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define pii pair<int, int> using namespace std; const int N = 1e5 + 7; const int M = 1e6 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 +7; int n, ans[N], id[N]; LL base = 1500000ll * 1500000; struct Vector { Vector(LL x = 0, LL y = 0) { this->x = x; this->y = y; } Vector operator + (const Vector &rhs) const { return Vector(x + rhs.x, y + rhs.y); } Vector operator - (const Vector &rhs) const { return Vector(x - rhs.x, y - rhs.y); } LL len() { return x * x + y * y; } LL x, y, id; }a[N]; int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%lld%lld", &a[i].x, &a[i].y); id[i] = i; } while(1) { random_shuffle(id + 1, id + n); Vector now; for(int i = n; i >= 1; i--) { int pos = id[i]; Vector nx1 = now + a[pos]; Vector nx2 = now - a[pos]; if(nx1.len() <= nx2.len()) { now = nx1; ans[pos] = 1; } else { now = nx2; ans[pos] = -1; } } if(now.len() <= base) { for(int i = 1; i <= n; i++) { printf("%d ", ans[i]); } puts(""); return 0; } } return 0; } /* */