Codeforces Round 503 Div2
http://codeforces.com/contest/1020
A. New Building for SIS
题意略。
要注意同幢楼的情况!
code:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using namespace std;
typedef long long ll;
ll n, h, a, b, k, t1, t2, f1, f2;
int main() {
scanf("%lld%lld%lld%lld%lld", &n, &h, &a, &b, &k);
while (k--) {
scanf("%lld%lld%lld%lld", &t1, &f1, &t2, &f2);
if (f1 > f2) swap(f1, f2);
if (t1 > t2) swap(t1, t2);
ll dis = 0;
if (t1 == t2) {
dis += (f2 - f1);
} else {
if (f1 < a) dis += a - f1, f1 = a;
else if (f1 > b) dis += f1 - b, f1 = b;
if (f2 < a) dis += a - f2, f2 = a;
else if (f2 > b) dis += f2 - b, f2 = b;
dis += (f2 - f1) + (t2 - t1);
}
printf("%lld\n", dis);
}
return 0;
}
B. Badge
题意略。
无脑 n^2 模拟(??)
code:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using namespace std;
int n, p[1005], mark[1005];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &p[i]);
for (int i = 1; i <= n; i++) {
memset(mark, 0, sizeof(mark));
int start = i;
mark[i] = 1;
while (!mark[p[start]]) {
start = p[start], mark[start] = 1;
}
start = p[start];
printf("%d ", start);
}
printf("\n");
return 0;
}
C. Elections
题意略。
此题卡了好久!后来干脆弃疗。。。
我一直在想是不是要设什么性价比,或者应该挑当前票最多的对手,拿ta一张票相等于两张之类,但由于很容易证明是错的,也就gg了。。。
正解在此:必定存在一个 x,使得 1 的票数 >= x, 2 ~ m 的票数 < x. 1 <= x <= 3000,枚举就行。n^2。
使所有 2 ~ m 的数量都降至 x 以下,最后若 1 的票数还是不 >= x,就挑剩下来最小的补上。
code:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using namespace std;
typedef long long ll;
const ll inf = 1e16;
int n, m, c[3010], b[3010];
ll ans, sum;
struct node {int p; ll c;}a[3010];
bool cmp(node a, node b) {return a.c > b.c;}
int main() {
scanf("%d%d", &n, &m);
rep(i, 1, n) scanf("%d%lld", &a[i].p, &a[i].c);
sort(a + 1, a + n + 1, cmp);
ans = inf;
rep(i, 1, n) {
rep(j, 1, m) c[j] = 0;
sum = 0;
rep(j, 1, n) b[j] = 0;
rep(j, 1, n) {
if (a[j].p == 1) c[1]++;
else {
if (c[a[j].p] + 1 >= i) sum += a[j].c, c[1]++, b[j] = 1;
else c[a[j].p]++;
}
}
for (int j = n; j >= 1; j--)
if (a[j].p != 1 && b[j] == 0 && c[1] < i) b[j] = 1, sum += a[j].c, c[1]++;
if (c[1] >= i) ans = min(ans, sum);
}
printf("%lld\n", ans);
return 0;
}
D. The hat
是个交互题??坑先留着