2016ACM/ICPC亚洲区沈阳站 Solution

A - Thickest Burger

水。

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

 

B - Relative atomic mass

水。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int t;
 5 char s[100];
 6 
 7 int main()
 8 {
 9     scanf("%d", &t);
10     while (t--)
11     {
12         scanf("%s", s);
13         int res = 0;
14         for (int i = 0, len = strlen(s); i < len; ++i)
15         {
16             if (s[i] == 'H') res += 1;
17             if (s[i] == 'C') res += 12;
18             if (s[i] == 'O') res += 16;
19         }
20         printf("%d\n", res);
21     }
22     return 0;
23 }
View Code

 

C - Recursive sequence

题意:求$F[n] = F[n - 1] + 2 \cdot F[n - 2] + n^4$

思路:考虑

$n^4 = (n - 1)^4 + 4 \cdot (n - 1) ^ 3 + 6 \cdot (n - 1) ^2 + 4 \cdot (n - 1) ^ 2 + (n - 1) + 1$

然后进行递推即可

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 #define ll long long
 5 
 6 const ll MOD = 2147493647;
 7 
 8 int t;
 9 ll n, a, b;
10 
11 struct node
12 {
13     ll a[7][7];
14     node () { memset(a, 0, sizeof a); }
15     node operator * (const node &r) const
16     {
17         node ans = node();
18         for (int i = 0; i < 7; ++i) for (int j = 0; j < 7; ++j) for (int k = 0; k < 7; ++k)
19             ans.a[i][j] = (ans.a[i][j] + a[i][k] * r.a[k][j] % MOD) % MOD;
20         return ans;
21     }
22 };
23 
24 ll tmp[7][7] = 
25 {
26     1, 1, 0, 0, 0, 0, 0,
27     2, 0, 0, 0, 0, 0, 0,
28     1, 0, 1, 0, 0, 0, 0,
29     4, 0, 4, 1, 0, 0, 0,
30     6, 0, 6, 3, 1, 0, 0,
31     4, 0, 4, 3, 2, 1, 0,
32     1, 0, 1, 1, 1, 1, 1,
33 };
34 
35 ll tmp2[7] = 
36 {
37     0, 0, 16, 8, 4, 2, 1,
38 };
39 
40 node qmod(ll n)
41 {
42     node base = node();
43     for (int i = 0; i < 7; ++i) for (int j = 0; j < 7; ++j)
44         base.a[i][j] = tmp[i][j];
45     node res = node();
46     for (int i = 0; i < 7; ++i) res.a[0][i] = tmp2[i];
47     while (n)
48     {
49         if (n & 1) res = res * base;
50         base = base * base;
51         n >>= 1;
52     }
53     return res;
54 }
55 
56 int main()
57 {
58     scanf("%d", &t);
59     while (t--)
60     {
61         scanf("%lld%lld%lld", &n, &a, &b);
62         if (n == 1) printf("%lld\n", a);
63         else if (n == 2) printf("%lld\n", b);
64         else
65         {
66             tmp2[0] = b; tmp2[1] = a;
67             printf("%lld\n", qmod(n - 2).a[0][0]);
68         }
69     }
70     return 0;
71 }
View Code

 

D - Winning an Auction

留坑。

 

E - Counting Cliques

题意:给出n个点,m条边,求点集大小为S的完全图个数

思路:以每个点为起点搜有多少完全图

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int maxn = 1e2 + 10;
 6 
 7 int n, m, s;
 8 int ans;
 9 int arr[maxn], tot;
10 int mp[maxn][maxn];
11 vector<int>G[maxn];
12 
13 void Init(int N)
14 {
15     ans = 0;
16     for(int i = 1; i <= N; ++i)
17     {
18         G[i].clear();
19         mp[i][i] = 1;
20         for(int j = i + 1; j <= N; ++j)
21         {
22             mp[i][j] = mp[j][i] = 0;
23         }
24     }
25 }
26 
27 void DFS(int u, int cnt)
28 {
29     if(cnt == s)
30     {
31         ++ans;
32         return ;
33     }
34     for(auto it: G[u])
35     {
36         bool flag = true;
37         for(int i = 0; i < tot; ++i)
38         {
39             if(!mp[arr[i]][it]) 
40             {
41                 flag = false;
42                 break;
43             }
44         }
45         if(flag)
46         {
47             arr[tot++] = it;
48             DFS(it, cnt + 1);
49             tot--;
50         }
51     }
52 }
53 
54 int main()
55 {
56     int t;
57     scanf("%d", &t);
58     while(t--)
59     {
60         scanf("%d %d %d", &n, &m, &s);
61         Init(n);
62         for(int i = 1; i <= m; ++i)
63         {
64             int u, v;
65             scanf("%d %d", &u, &v);
66             G[u].push_back(v);
67             mp[u][v] = mp[v][u] = 1;
68         }
69         for(int i = 1; i <= n; ++i)
70         {
71             tot = 0;
72             arr[tot++] = i;
73             DFS(i, 1);
74         }
75         printf("%d\n", ans);
76     }
77     return 0;
78 }
View Code

 

 

G - Do not pour out

题意:有一个底部为直径为2的圆,高度为2的桶,现在里面有高度为h的液体,将桶倾斜至最大,求上表面面积

思路:分类,若经过没经过底部则为PI / cos(2.0-d)

否则二分+积分求面积

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const double eps = 1e-20;
 6 const double PI = acos(-1.0);
 7 
 8 int sgn(double x)
 9 {
10     if(fabs(x) < eps) return 0;
11     else return x > 0 ? 1 : -1;
12 }
13 
14 double d;
15 
16 double calc(double arc)
17 {
18     return PI * cos(arc) - arc * cos(arc) + sin(arc) - sin(arc) * sin(arc) * sin(arc) / 3.0;
19 }
20 
21 int check(double mid)
22 {
23     double tmp = (calc(acos(2.0 * tan(mid) - 1.0)) - calc(PI)) / tan(mid);
24     return sgn(tmp - d * PI);
25 }
26 
27 double get(double l, double r)
28 {
29     if(check(l) == 0) return l;
30     int cnt = 256;
31     while(cnt--)
32     {
33         double mid = (l + r) / 2.0;
34         int tmp = check(mid);
35         if(tmp == 0) return mid;
36         if(tmp == 1) r = mid;
37         if(tmp == -1) l = mid;
38     }
39     return l;
40 }
41 
42 int main()
43 {
44     int t;
45     scanf("%d", &t);
46     while(t--)
47     {
48         scanf("%lf", &d);
49         if(sgn(d) == 0)
50         {
51             printf("0.00000\n");
52         }
53         else if(sgn(d - 1) > 0)
54         {
55             double arc = atan(2.0 - d);
56             double ans = PI / cos(arc);
57             printf("%.5f\n", ans);
58         }
59         else
60         {
61             double tmp = get(eps, PI / 4.0);
62             double t1 = 2.0 * tan(tmp) - 1.0;
63             double arc = acos(t1);
64             double ans = PI - arc + cos(arc) * sin(arc);
65             ans = ans / sin(tmp);
66             printf("%.5f\n", ans);
67         }
68     }
69     return 0;
70 }
View Code

 

H - Guessing the Dice Roll

留坑。

 

I - The Elder

题意:给出一棵树,每个点到根节点1的方式可以是连续走,也可以经过一个点消耗时间p,使得重新计算所经过路径,求每个点到根节点最小的最大时间   时间为$L^2$

思路:考虑朴素的转移 $F[i] = min(F[j] + p + (sum[i] - sum[j]) ^ 2) (j 为 i 的祖先们)$

拆分式子

$F[i] = F[j] + p + {sum[i]} ^ 2 - 2 \cdot sum[i] \cdot sum[j] + {sum[j]} ^ 2$

$F[j] = F[i] + 2 \cdot sum[i] \cdot sum[j] - p - {sum[i]} ^ 2 - {sum[j]} ^ 2$

考虑斜率优化

树上的单调队列优化可以通过标记最后一个更改的值,然后还原(XHT)

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 typedef long long ll;
 6 
 7 const int maxn = 1e5 + 10;
 8 
 9 struct Edge{
10     int to, nxt;
11     ll w;
12     Edge(){}
13     Edge(int to, int nxt, ll w): to(to), nxt(nxt), w(w){}
14 }edge[maxn << 1];
15 
16 ll ans;
17 ll dis[maxn];
18 ll dp[maxn];
19 int n, p;
20 int que[maxn];
21 int head[maxn], tot;
22 
23 void Init(int N)
24 {
25     for(int i = 1; i <= N; ++i) head[i] = -1;
26     tot = ans = 0;
27 }
28 
29 void addedge(int u, int v, ll w)
30 {
31     edge[tot] = Edge(v, head[u], w);
32     head[u] = tot++;
33 }
34 
35 ll dy(int j, int k)
36 {
37     return dp[j] - dp[k] + dis[j] * dis[j] - dis[k] * dis[k];
38 }
39 
40 ll dx(int j, int k)
41 {
42     return 2 * (dis[j] - dis[k]);
43 }
44 
45 void DFS(int u, int fa, int l, int r)
46 {
47     int remind = -1;
48     
49     if(u != 1)
50     {
51         while(l < r && dy(que[l + 1], que[l]) <= dis[u] * dx(que[l + 1], que[l])) l++;
52 //        cout << u << " " << que[l] << " " << dp[que[l]] + p + (dis[u] - dis[que[l]]) * (dis[u] - dis[que[l]]) << endl;
53         dp[u] = min(dis[u] * dis[u], dp[que[l]] + p + (dis[u] - dis[que[l]]) * (dis[u] - dis[que[l]]));
54         while(l < r && dy(que[r], que[r - 1]) * dx(u, que[r]) >= dy(u, que[r]) * dx(que[r], que[r - 1])) r--;
55         remind = que[++r];
56         que[r] = u;
57     }
58 
59     ans = max(ans, dp[u]);
60 
61     for(int i = head[u]; ~i; i = edge[i].nxt)
62     {
63         int v = edge[i].to;
64         if(v == fa) continue;
65         dis[v] = dis[u] + edge[i].w;
66         DFS(v, u, l, r);
67     }
68 
69     if(remind != -1) que[r] = remind;
70 }
71 
72 
73 int main()
74 {
75     int t;
76     scanf("%d", &t);
77     while(t--)
78     {
79         scanf("%d %d", &n, &p);
80         Init(n);
81         for(int i = 1; i < n; ++i)
82         {
83             int u, v, w;
84             scanf("%d %d %d", &u, &v ,&w);
85             addedge(u, v, w);
86             addedge(v, u, w);
87         }
88         DFS(1, -1, 1, 0);
89 //        for(int i = 1; i <= n; ++i) cout << i << " " << dp[i] << endl;
90         printf("%lld\n", ans);
91     }
92     return 0;
93 }
View Code

 

J - Query on a graph

留坑。

 

K - New Signal Decomposition

留坑。

 

L - A Random Turn Connection Game

留坑。

 

M - Subsequence

留坑。

转载于:https://www.cnblogs.com/Dup4/p/9786924.html

源码链接: https://pan.quark.cn/s/a4b39357ea24 Modbus协议是一种普遍应用的通信协议,在工业自动化领域具有显著地位,它为不同设备间的客户机/服务器通信确立了标准。该协议立足于OSI模型的第7层,即应用层,旨在实现通过多种总线或网络连接的设备之间的数据交换。Modbus协议主要由三个核心部分构成: 1. **Modbus协议规范**:这部分详细阐述了MODBUS事务处理机制,包括如何组织和发送请求/响应报文。它定义了一组功能码,这些功能码是MODBUS协议的数据包(PDU)的组成部分,用于表明不同的服务操作。 2. **MODBUS报文传输在TCP/IP上的实现指南**:这一部分为开发者提供了在TCP/IP上实现MODBUS应用层的指导,参考了IETF的标准RFC793(TCP)和RFC791(IP),以确保MODBUS报文能在网络上正确传输。 3. **MODBUS报文传输在串行链路上的实现指南**:针对使用如EIA-232和EIA-485等串行通信标准的设备,提供了实现MODBUS应用层的指导,确保在串行链路上的数据完整性。 MODBUS协议支持两种通信模式: - **Modbus RTU (Remote Terminal Unit)**:适用于异步串行通信,通常用于低速、短距离通信,如EIA/TIA-232、EIA-422和EIA/TIA-485。 - **Modbus TCP/IP**:基于互联网协议,使用以太网II/802.3标准,适合高速、远程通信。 在MODBUS通信栈中,MODBUS应用层位于TCP/IP之上,借助TCP的可靠连接特性,确保数据包按顺序到达。而在串行链路上,MODBUS协议则直接与物理层交...
源码直接下载地址: https://pan.quark.cn/s/31ad939aed54 "关于 SR 锁存器的解析及其应用" SR 锁存器被视为一种核心的数字电子技术部件,它在数字电路构建和计算机系统的开发中占据着举足轻重的地位。SR 锁存器的构造基础是两个与非门,具体标识为 G1 和 G2。该锁存器的工作机制主要依托于 S 和 R 两个输入端信号的逻辑关联,以此来调控输出端 Q 的状态。 SR 锁存器的工作机制可以依据输入信号的不同组合分为四种情形: 1. 在 R=0、S=0 的条件下,状态将保持恒定,即 Qn+1 等同于 Qn。 2. 当 R=0、S=1 时,执行置位操作,使得 Qn+1=1。 3. 若 R=1、S=0,则执行复位操作,导致 Qn+1=0。 4. 当 R=1、S=1 时,状态呈现不确定特性,输出端 Q 的具体状态无法预测。 SR 锁存器的实践应用极为普遍,譬如在数字电路的规划中,它能够充当 Flip-Flop 功能的载体,常见于计数器、寄存器以及计算机系统之中。此外,SR 锁存器也被广泛用于消弭由机械开关触点颤动所引发的脉冲信号输出问题。 逻辑门控 SR 锁存器可视为 SR 锁存器的一种演进形态,它通过增设使能信号 E,对 SR 锁存器的输出进行调控。逻辑门控 SR 锁存器的运作机制基于 E、S 以及 R 三个输入端信号的逻辑联系,用以控制输出端 Q 的状态。 逻辑门控 SR 锁存器的应用场景同样十分多样,例如在数字电路的设计过程中,它能够协助实现更为复杂的逻辑操作。 D 锁存器亦是一种基础性的数字电子技术器件,其运作原理与 SR 锁存器相近,但 D 锁存器的输出端 Q 仅受输入信号 D 的影响。D 锁存器的实践用途同样广泛,例如在数字电路的...
源码直接下载地址: https://pan.quark.cn/s/96ee77ac4da8 根据题目指示,我们将从标题“C 语言 打印沙漏”、描述“PAT 测试题 打印沙漏 但是不知道为什么我的提交就是无效”以及部分提供的代码片段入手,对与“打印沙漏”相关的基础知识进行深入剖析。 ### 一、问题背景 题目要求在 C 语言环境下开发程序,用以生成一个沙漏形态。该任务属于 PAT(Programming Ability Test)考试中的一个环节,主要评估考生对循环结构的掌握和应用水平。从描述信息来看,尽管提交者已经完成了代码的编写工作,但在 PAT 平台上却显示提交无效。这或许是因为程序在逻辑上存在偏差或未能满足题目的具体规范所致。 ### 二、打印沙漏的原理 #### 1. 沙漏的基本构造 沙漏由上下两个对称部分构成。每一行均由一定数量的星号和空格组成。随着行数的改变,星号的数量也会发生相应的增减变化。 #### 2. 实现过程 - **确定沙漏的规模**:首先需要明确沙漏的总行数(n),这将直接影响沙漏的最大宽度。 - **计算每一行的星号数目**:对于第 i 行(i 从 1 开始计算),其星号数目遵循公式 `2 * (n - abs(i - n)) - 1` 进行确定。 - **确定每行的空格数目**:对于第 i 行,空格数目为 `abs(n - i) - 1`。 - **输出星号和空格**:依据计算出的数量,依次输出星号和空格即可完成一行的打印。 #### 3. 代码范例 下面给出一个基础的 C 语言代码范例,用于生成沙漏: ```c #include <stdio.h> int main() { int n; printf("请输入沙漏的行数:"); sc...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值