zoukankan      html  css  js  c++  java
  • 牛客国庆集训派对Day7 Solution

    A    Relic Discovery

    水。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3  
     4 int t, n;
     5  
     6 int main()
     7 {
     8     scanf("%d", &t);
     9     while (t--)
    10     {
    11         scanf("%d", &n);
    12         int res = 0;
    13         for (int i = 1, a, b; i <= n; ++i)
    14         {
    15             scanf("%d%d", &a, &b);
    16             res += a * b;
    17         }
    18         printf("%d
    ", res);
    19     }
    20     return 0;
    21 }
    View Code

    B    Pocket Cube

    按题意模拟即可,注意顺时针转逆时针转均可,也就是说一个面有八种旋转可能

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3  
     4 int t;
     5 int G[10][10], tmp[10][10];
     6  
     7 bool ok()
     8 {
     9     for (int i = 1; i <= 6; ++i)
    10         for (int j = 2; j <= 4; ++j)
    11             if (tmp[i][j] != tmp[i][j - 1])
    12                 return false;
    13     return true;
    14 }
    15  
    16 void clear()
    17 {
    18     for (int i = 1; i <= 6; ++i)
    19         for (int j = 1; j <= 4; ++j)
    20             tmp[i][j] = G[i][j];
    21 }
    22  
    23 int origin[][8][2] =
    24 {
    25     // top
    26     {4, 3, 4, 4, 6, 1, 6, 3, 2, 2, 2, 1, 5, 4, 5, 2,},
    27     // bottom
    28     {4, 1, 4, 2, 6, 1, 6, 3, 2, 4, 2, 3, 5, 3, 5, 1,},     
    29     // left
    30     {1, 1, 1, 3, 2, 1, 2, 3, 3, 1, 3, 3, 4, 1, 4, 3,},
    31     // right
    32     {1, 4, 1, 2, 4, 4, 4, 2, 3, 4, 3, 2, 2, 4, 2, 2,},
    33     // front
    34     {1, 3, 1, 4, 6, 3, 6, 4, 3, 2, 3, 1, 5, 3, 5, 4,},
    35     // back
    36     {3, 3, 3, 4, 6, 2, 6, 1, 1, 2, 1, 1, 5, 2, 5, 1,},
    37 };
    38  
    39 int Move[][8][2] =
    40 {
    41     {5, 4, 5, 2, 4, 3, 4, 4, 6, 1, 6, 3, 2, 2, 2, 1,},
    42     {5, 3, 5, 1, 4, 1, 4, 2, 6, 1, 6, 3, 2, 4, 2, 3,},
    43     {4, 1, 4, 3, 1, 1, 1, 3, 2, 1, 2, 3, 3, 1, 3, 3,},
    44     {2, 4, 2, 2, 1, 4, 1, 2, 4, 4, 4, 2, 3, 4, 3, 2,},
    45     {5, 3, 5, 4, 1, 3, 1, 4, 6, 3, 6, 4, 3, 2, 3, 1,},
    46     {5, 2, 5, 1, 3, 3, 3, 4, 6, 2, 6, 1, 1, 2, 1, 1,},
    47 };
    48  
    49 bool work()
    50 {
    51     clear(); if (ok()) return true;
    52     for (int i = 0; i < 6; ++i)
    53     {
    54         for (int j = 0; j < 8; j += 2)
    55         {
    56             clear();
    57             for (int k = 0; k < 8; ++k)
    58             {
    59                 int x = (j + k) % 8;
    60                 tmp[origin[i][x][0]][origin[i][x][1]] = G[Move[i][x][0]][Move[i][x][1]];
    61             }
    62             if (ok()) return true;
    63         }
    64         for (int j = 1; j < 8; j += 2)
    65         {
    66             clear();
    67             for (int k = 0; k > -8; --k)
    68             {
    69                 int x = (j + k + 8) % 8;
    70                 int y = (x + 4) % 8;
    71                 tmp[origin[i][x][0]][origin[i][x][1]] = G[Move[i][y][0]][Move[i][y][1]];
    72             }
    73             if (ok()) return true;
    74         }
    75     }
    76     return false;
    77 }
    78  
    79 int main()
    80 {
    81     scanf("%d", &t);
    82     while(t--)
    83     {
    84         for (int i = 1; i <= 6; ++i)
    85             for (int j = 1; j <= 4; ++j)
    86                 scanf("%d", &G[i][j]);
    87         puts(work() ? "YES" : "NO");
    88     }
    89     return 0;
    90 }
    View Code

    C    Pocky

    根据样例发现规律 答案为  log(l / d) + 1.0  如果 l <= d  答案为0

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3  
     4 const double eps = 1e-8;
     5  
     6 int t;
     7 double l, d;
     8  
     9 int main()
    10 {
    11     scanf("%d", &t);
    12     while (t--)
    13     {
    14         scanf("%lf%lf", &l, &d);
    15         if (l <= d || fabs(l - d) <= eps)
    16             printf("%.6f
    ", 0.0);
    17         else
    18             printf("%.6f
    ", log(l / d) + 1.0);
    19     }
    20     return 0;
    21 }
    View Code

    D    Lucky Coins

    留坑。

    E    Fibonacci

    留坑。

    F    Lambda Calculus

    留坑。

    G    Coding Contest

    题意:有n个区域,每个区域有$s_i$个人以及$b_i$个食物,有m条路,每条路最多让$c_i$个人走,其中第一个人走不产生影响,后面的每个人都有p的可能破坏 求最小的破坏可能

    思路:将p取log就变成了累加最小,建立一个源点以及一个汇点,其中每块区域需要出走的人和汇点相连,可以进来的人与源点相连,跑一遍最小费用最大流即可

      1 #include<bits/stdc++.h>
      2  
      3 using namespace std;
      4  
      5 const double eps = 1e-8;
      6 const double EI = exp(1.0);
      7 const int maxn = 10000;
      8 const int maxm = 100000;
      9 const int INF = 0x3f3f3f3f;
     10  
     11 int sgn(double x)
     12 {
     13     if(fabs(x) < eps) return 0;
     14     else return x > 0 ? 1 : -1;
     15 }
     16  
     17 struct Edge{
     18     int to, nxt, cap, flow;
     19     double cost;
     20 }edge[maxm];
     21  
     22 double ans;
     23 int head[maxn], tot;
     24 int pre[maxn];
     25 double dis[maxn];
     26 bool vis[maxn];
     27 int N;
     28  
     29 void Init(int n)
     30 {
     31     N = n;
     32     tot = 0;
     33     for(int i = 0; i <= n; ++i) head[i] = -1;
     34 }
     35  
     36 void addedge(int u, int v,int cap, double cost)
     37 {
     38     edge[tot].to = v;
     39     edge[tot].cap = cap;
     40     edge[tot].cost = cost;
     41     edge[tot].flow = 0;
     42     edge[tot].nxt = head[u];
     43     head[u] = tot++;
     44  
     45     edge[tot].to = u;
     46     edge[tot].cap = 0;
     47     edge[tot].cost = -cost;
     48     edge[tot].flow = 0;
     49     edge[tot].nxt = head[v];
     50     head[v] = tot++;
     51 }
     52  
     53 bool SPFA(int s,int t)
     54 {
     55     queue<int>q;
     56     for(int i = 0; i < N; ++i)
     57     {
     58         dis[i] = INF;
     59         vis[i] = false;
     60         pre[i] = -1;
     61     }
     62     dis[s] = 0;
     63     vis[s] = true;
     64     q.push(s);
     65     while(!q.empty())
     66     {
     67         int u = q.front();
     68         q.pop();
     69         vis[u] = false;
     70         for(int i = head[u]; ~i; i = edge[i].nxt)
     71         {
     72             int v = edge[i].to;
     73             if(edge[i].cap > edge[i].flow && sgn(dis[v] - dis[u] - edge[i].cost) > 0)
     74             {
     75                 dis[v] = dis[u] + edge[i].cost;
     76                 pre[v] = i;
     77                 if(!vis[v])
     78                 {
     79                     vis[v] = true;
     80                     q.push(v);
     81                 }
     82             }
     83         }
     84     }
     85     if(pre[t] == -1) return false;
     86     else return true;
     87 }
     88  
     89 int minCostMaxflow(int s, int t)
     90 {
     91     int flow = 0;
     92     ans = 0;
     93     while(SPFA(s, t))
     94     {
     95         int Min = INF;
     96         for(int i = pre[t]; ~i; i = pre[edge[i ^ 1].to])
     97         {
     98             Min = min(Min, edge[i].cap - edge[i].flow);
     99         }
    100         for(int i = pre[t]; ~i; i = pre[edge[i ^ 1].to])
    101         {
    102             edge[i].flow += Min;
    103             edge[i ^ 1].flow -= Min;
    104             ans += edge[i].cost * Min;
    105         }
    106         flow += Min;
    107     }
    108     return flow;
    109 }
    110  
    111 int n, m;
    112 int s[maxn], b[maxn], tmp[maxn];
    113  
    114 int main()
    115 {
    116     int t;
    117     scanf("%d", &t);
    118     while(t--)
    119     {
    120         scanf("%d %d", &n, &m);
    121         Init(n + 2);
    122         for(int i = 1; i <= n; ++i)
    123         {
    124             scanf("%d %d", s + i, b + i);
    125             if(s[i] - b[i] > 0) addedge(0, i, s[i] - b[i], 0);
    126             if(s[i] - b[i] < 0) addedge(i, n + 1, b[i] - s[i], 0);  
    127         }
    128  
    129         for(int i = 1; i <= m; ++i)
    130         {
    131             int u, v, c;
    132             double p;
    133             scanf("%d %d %d %lf", &u, &v, &c ,&p);
    134             p = -log(1.0 - p);
    135             if(c > 0) addedge(u, v, 1, 0);
    136             if(c > 1) addedge(u, v, c - 1, p);
    137         }
    138         int flow = minCostMaxflow(0, n + 1);
    139         ans = pow(EI, -ans);
    140         printf("%.2f
    ", 1.0 - ans);
    141     }
    142     return 0;
    143 }
    View Code

    H    Pattern

    留坑。

    I    Travel Brochure

    留坑。

    J    Cliques

    留坑。

    K    Finding Hotels

    题意:有若干酒店,以及一些旅客,每个旅客有价格接受范围,对于每个旅客要找出可接受价格以内的所有酒店中最近的

    思路:KDTree 对于价格直接特判,如果超出,直接return INF  还要注意多解的情况下取id小的

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 
      4 #define ll long long
      5 #define N 200010
      6 #define DIM 10
      7 #define INF 0x3f3f3f3f3f3f3f3f
      8 inline ll sqr(ll x) { return x * x; }
      9 namespace KD
     10 {
     11     int K;
     12     struct Point
     13     {
     14         ll x[DIM]; 
     15         int id;
     16         ll distance(const Point &b) const  
     17         { 
     18             if (x[2] < b.x[2]) return INF;      
     19             ll ret = 0;  
     20             for (int i = 0; i < K; ++i) ret += sqr(x[i] - b.x[i]);  
     21             return ret;
     22         }
     23         void input(int id) { this->id = id; for (int i = 0; i < K + 1; ++i) scanf("%lld", x + i); }
     24         void output() { for (int i = 0; i < K + 1; ++i) printf("%lld%c", x[i], " 
    "[i == K]); }
     25     };
     26     struct cmpx  
     27     {
     28         int div;
     29         cmpx(const int &div) { this->div = div; }
     30         bool operator () (const Point &a, const Point &b)
     31         { 
     32             for (int i = 0; i < K; ++i) if (a.x[(div + i) % K] != b.x[(div + i) % K]) 
     33                 return a.x[(div + i) % K] < b.x[(div + i) % K];
     34             return true;
     35         }
     36     };
     37     bool cmp(const Point &a, const Point &b, int div) { return cmpx(div)(a, b); }   
     38     struct node
     39     {
     40         Point e;
     41         node *lc, *rc; 
     42         int div; 
     43     }pool[N], *tail, *root; 
     44     void init() { tail = pool; } 
     45     node* build(Point *a, int l, int r, int div) 
     46     {
     47         if (l >= r) return NULL;
     48         node *p = tail++;
     49         p->div = div;  
     50         int mid = (l + r) >> 1;
     51         nth_element(a + l, a + mid, a + r, cmpx(div));
     52         p->e = a[mid];
     53         p->lc = build(a, l, mid, (div + 1) % K);
     54         p->rc = build(a, mid + 1, r, (div + 1) % K);
     55         return p;  
     56     }
     57     Point res; ll Min;
     58     void search(Point p, node *x, int div) 
     59     {
     60         if (!x) return; 
     61         if (cmp(p, x->e, div))
     62         {
     63             search(p, x->lc, (div + 1) % K);  
     64             ll tmp = p.distance(x->e); 
     65             if (tmp < Min || tmp == Min && x->e.id < res.id)   
     66             {
     67                 Min = tmp;
     68                 res = x->e;
     69             }
     70             if (sqr(x->e.x[div] - p.x[div]) <= Min)  
     71                 search(p, x->rc, (div + 1) % K);  
     72         }
     73         else
     74         {
     75             search(p, x->rc, (div + 1) % K);
     76             ll tmp = p.distance(x->e);  
     77             if (tmp < Min || tmp == Min && x->e.id < res.id)
     78             {
     79                 Min = tmp;
     80                 res = x->e;  
     81             }
     82             if (sqr(x->e.x[div] - p.x[div]) <= Min)
     83                 search(p, x->lc, (div + 1) % K);  
     84         }
     85     }
     86     void search(Point p)
     87     {
     88         Min = INF;
     89         search(p, root, 0);
     90     }
     91 }
     92 
     93 int t, n, q;
     94 KD::Point p[N];
     95 
     96 void Run()
     97 {
     98     for (scanf("%d", &t); t--; )
     99     {
    100         KD::K = 2;
    101         scanf("%d%d", &n, &q); 
    102         for (int i = 0; i < n; ++i) p[i].input(i);
    103         KD::init();
    104         KD::root = KD::build(p, 0, n, 0);
    105         for (int i = 1; i <= q; ++i)
    106         {
    107             KD::Point o; o.input(0);
    108             KD::search(o);
    109             KD::res.output(); 
    110         }
    111     }
    112 }
    113 
    114 int main()
    115 {
    116     #ifdef LOCAL
    117         freopen("Test.in", "r", stdin); 
    118     #endif 
    119 
    120     Run();
    121     return 0;
    122 
    123 }
    View Code

    L    Tower Attack

    留坑。

    M    Generator and Monitor

    留坑。

  • 相关阅读:
    洛谷 P1941 飞扬的小鸟
    洛谷P2464 [SDOJ2008]郁闷的小J
    [cogs2314][HZOI 2015] Persistable Editor
    [vijos1067]Warcraft III 守望者的烦恼
    【vijos1049】送给圣诞夜的礼品
    [cogs347]地震
    gcc 编译多个源文件
    2_兔子产仔问题
    1_鸡兔同笼问题
    LeetCode(61) Rotate List
  • 原文地址:https://www.cnblogs.com/Dup4/p/9750466.html
Copyright © 2011-2022 走看看