牛客国庆集训派对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\n", 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\n", 0.0);
17         else
18             printf("%.6f\n", 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\n", 1.0 - ans);
141     }
142     return 0;
143 }
View Code

H    Pattern

留坑。

I    Travel Brochure

留坑。

J    Cliques

留坑。

K    Finding Hotels

留坑。

L    Tower Attack

留坑。

M    Generator and Monitor

留坑。

猜你喜欢

转载自www.cnblogs.com/Dup4/p/9750466.html