zoukankan      html  css  js  c++  java
  • 日常训练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
  • 相关阅读:
    项目alpha冲刺-测试
    项目Alpha冲刺--9/10
    项目Alpha冲刺--8/10
    项目Alpha冲刺--7/10
    项目Beta冲刺(1/7)(追光的人)(2019.5.23)
    Beta之前-凡事预则立(校园帮-追光的人)
    事后诸葛亮(追光的人)
    问题回答
    Alpha冲刺总结
    Alpha冲刺(10/10)——追光的人
  • 原文地址:https://www.cnblogs.com/yijiull/p/7745254.html
Copyright © 2011-2022 走看看