日常训练17-10-27(16杭州ccpc)

链接:here

Car

 HDU - 5935 

精度问题有点迷。。。

 不知道为什么用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 }
View Code

ArcSoft's Office Rearrangement

 HDU - 5933 

要用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 }
View Code

Four Operations

 HDU - 5938

枚举一下减号的位置,加号位置有两种情况

 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 }
View Code

Bomb

 HDU - 5934 

强连通缩点,变成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 }
View Code

Kingdom of Obsession

 HDU - 5943 

二分图匹配

据说十亿之内两个素数的间隔不超过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 }
View Code
原文地址:https://www.cnblogs.com/yijiull/p/7745254.html