链接:here
Car
精度问题有点迷。。。
不知道为什么用ceil就是过不了。。。

1 #include <bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 const int maxn = 100010; 5 double a[maxn], b[maxn]; 6 7 int main(){ 8 int t, kase = 0; 9 scanf("%d", &t); 10 while(t--){ 11 int n; 12 scanf("%d", &n); 13 for(int i = 1; i <= n; i++) scanf("%lf", &a[i]), b[i-1] = a[i] - a[i-1]; 14 LL ans = 1; 15 for(int i = n-2; i >= 0; i--){ 16 int temp = b[i] / b[i+1]; 17 if(b[i] / temp != b[i+1]) temp++; 18 b[i] = b[i] / temp; 19 ans += temp; 20 } 21 printf("Case #%d: %lld ", ++kase, ans); 22 } 23 }
ArcSoft's Office Rearrangement
要用long long
直接分,多余的放到后面分

1 #include <bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 const int maxn = 300010; 5 LL a[maxn]; 6 7 int main(){ 8 int t, kase = 0; 9 scanf("%d", &t); 10 while(t--){ 11 int n, k; 12 scanf("%d %d", &n, &k); 13 LL sum = 0; 14 for(int i = 1; i <= n; i++){ 15 scanf("%lld", &a[i]); 16 sum += a[i]; 17 } 18 LL ans = 0; 19 if(sum % k) { 20 ans = -1; 21 }else{ 22 LL r = sum / k; 23 for(int i = 1; i <= n; i++){ 24 if(a[i] > r){ 25 ans += (a[i] / r - 1) + (a[i] % r != 0); 26 a[i] %= r; 27 } 28 if(a[i] && a[i] < r){ 29 a[i+1] += a[i]; 30 ans++; 31 } 32 } 33 } 34 printf("Case #%d: %lld ", ++kase, ans); 35 } 36 }
Four Operations
枚举一下减号的位置,加号位置有两种情况

1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn =22; 4 char s[maxn]; 5 #define LL long long 6 LL get(char *s, int n){ 7 LL c = 0; 8 int i = 0; 9 while(i < n) c = c*10 +s[i++] -'0'; 10 return c; 11 } 12 int main(){ 13 int t, kase = 0; 14 scanf("%d", &t); 15 while(t--){ 16 scanf("%s", s); 17 int len = strlen(s); 18 LL ans = -1e18; 19 for(int i = 1; i <= len - 4; i++){ 20 LL a = get(&s[0], 1); 21 LL b = get(&s[1], i); 22 LL c = get(&s[i+1], 1); 23 LL d = s[i+2] - '0'; 24 LL e = get(&s[i+3], len - i - 3); 25 ans = max(ans, a+b-c*d/e); 26 a = get(&s[0], i); 27 b = get(&s[i], 1); 28 ans = max(ans, a+b-c*d/e); 29 } 30 31 printf("Case #%d: %lld ", ++kase, ans); 32 } 33 }
Bomb
强连通缩点,变成DAG,然后找到所有入度为0的点,选择最小的代价,加起来

1 #include <bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 const int maxn = 1010; 5 struct Cir{ 6 int x, y, r, c; 7 }p[maxn]; 8 const int MAXV = 1010; 9 const int MAXE = 1000010; 10 struct Edge{ 11 int v, nex; 12 }e[MAXE]; 13 int head[MAXV]; 14 int cnt; 15 void init(){ 16 memset(head, -1, sizeof(head)); 17 cnt = 0; 18 } 19 void add(int u, int v){ 20 e[cnt].v = v; 21 e[cnt].nex = head[u]; 22 head[u] = cnt++; 23 } 24 25 double getdis(int i, int j){ 26 LL x = p[i].x - p[j].x; 27 LL y = p[i].y - p[j].y; 28 return sqrt(x*x + y*y); 29 } 30 //SCC 31 int pre[MAXV], low[MAXV], sccno[MAXV]; 32 int dfsk, scc_cnt; 33 stack<int> s; 34 35 void dfs(int u){ 36 pre[u] = low[u] = ++dfsk; 37 s.push(u); 38 for(int i = head[u]; ~i; i = e[i].nex){ 39 int v = e[i].v; 40 if(!pre[v]){ 41 dfs(v); 42 low[u] = min(low[u], low[v]); 43 }else if(!sccno[v]){ 44 low[u] = min(low[u], pre[v]); 45 } 46 } 47 if(low[u] == pre[u]){ 48 scc_cnt++; 49 for(;;){ 50 int v = s.top(); 51 s.pop(); 52 sccno[v] = scc_cnt; 53 if(v == u) break; 54 } 55 } 56 } 57 58 void find_scc(int n){ 59 memset(sccno, 0, sizeof(sccno)); 60 memset(pre, 0, sizeof(pre)); 61 //memset(low, 0, sizeof(low)); 62 dfsk = scc_cnt = 0; 63 for(int i = 0; i < n; i++) if(!pre[i]) dfs(i); 64 } 65 66 int in[MAXV], out[MAXV]; 67 68 int main(){ 69 int t, kase = 0; 70 scanf("%d", &t); 71 while(t--){ 72 init(); 73 memset(in, 0, sizeof(in)); 74 memset(out, 0, sizeof(out)); 75 int n; 76 scanf("%d", &n); 77 for(int i = 0; i < n; i++) { 78 scanf("%d %d %d %d", &p[i].x, &p[i].y, &p[i].r, &p[i].c); 79 } 80 for(int i = 0; i < n; i++){ 81 for(int j = 0; j < n; j++) if(i != j){ 82 double dis = getdis(i, j); 83 if(dis <= p[i].r) add(i, j); 84 } 85 } 86 find_scc(n); 87 LL ans = 0; 88 for(int u = 0; u < n; u++){ 89 for(int i = head[u]; ~i; i = e[i].nex){ 90 int v = e[i].v; 91 if(sccno[u] != sccno[v]) { 92 in[sccno[v]]++; 93 out[sccno[u]]++; 94 } 95 } 96 } 97 for(int i = 1; i <= scc_cnt; i++){ 98 if(in[i] == 0){ 99 LL temp = 0x3f3f3f3f; 100 for(int u = 0; u < n; u++){ 101 if(sccno[u] == i && temp > p[u].c) temp = p[u].c; 102 } 103 ans += temp; 104 } 105 } 106 printf("Case #%d: %lld ", ++kase, ans); 107 } 108 }
Kingdom of Obsession
二分图匹配
据说十亿之内两个素数的间隔不超过300,二十亿素数间隔不超过600
大数据直接No,小数据跑二分图匹配
即找[s+1, s+n] 对应 [1, n] 的匹配
注意,如果s+1<=n , 则两个区间有相交, 需要去掉这段相交的区间,因为这段区间内可能有素数, 会影响判断结果。

1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 610; 4 5 int g[maxn][maxn]; 6 int n, s; 7 int mc[maxn], vb[maxn]; 8 9 int Hungary(int u){ 10 for(int i = 1; i <= n; i++) if(g[u][i] && !vb[i]){ 11 vb[i] = 1; 12 if(mc[i] == -1 || Hungary(mc[i])) { 13 mc[i] = u; 14 return 1; 15 } 16 } 17 return 0; 18 } 19 20 int main(){ 21 int t, kase = 0; 22 scanf("%d", &t); 23 while(t--){ 24 scanf("%d %d", &n, &s); 25 if(n > s) swap(n, s); 26 if(n >= maxn) { 27 printf("Case #%d: No ", ++kase); 28 continue; 29 } 30 memset(g, 0, sizeof(g)); 31 for(int i = s+1; i <= s+n; i++){ 32 for(int j = 1; j <= n; j++){ 33 if(i % j == 0) g[i-s][j] = 1; 34 } 35 } 36 int ans = 0; 37 memset(mc, -1, sizeof(mc)); 38 for(int i = 1; i <= n; i++) { 39 memset(vb, 0, sizeof(vb)); 40 if(Hungary(i)) ans++; 41 } 42 printf("Case #%d: ", ++kase); 43 if(ans == n) puts("Yes"); 44 else puts("No"); 45 } 46 }