第十四届浙江省赛

  题目真的是从易到难的顺序,而且跨度非常合理,只是看到榜单上后5题只有一支队做出来了一个,其他的没人做出来啊。。

A - Cooking Competition

水题。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 int n, a;
 5
 6 int main() {
 7     // freopen("in", "r", stdin);
 8     int T;
 9     scanf("%d", &T);
10     while(T--) {
11         scanf("%d", &n);
12         int ret = 0;
13         for(int i = 0; i < n; i++) {
14             scanf("%d", &a);
15             if(a == 1) ret++;
16             else if(a == 2) ret--;
17         }
18         if(ret == 0) puts("Draw");
19         else if(ret > 0) puts("Kobayashi");
20         else puts("Tohru");
21     }
22     return 0;
23 }

B - Problem Preparation

水题,细心点。特别是10~13题,差点被坑一小下。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 110;
 5 const int maxm = 1010;
 6 int n;
 7 int a[maxn];
 8
 9 int main() {
10     // freopen("in", "r", stdin);
11     int T;
12     scanf("%d", &T);
13     while(T--) {
14         scanf("%d", &n);
15         for(int i = 1; i <= n; i++) {
16             scanf("%d", &a[i]);
17         }
18         if(n < 10 || n > 13) {
19             puts("No");
20             continue;
21         }
22         sort(a+1, a+n+1);
23         if(a[1] <= 0) {
24             puts("No");
25             continue;
26         }
27         int one = 0;
28         bool abflg = 0;
29         for(int i = 1; i <= n; i++) {
30             if(a[i] == 1) one++;
31         }
32         for(int i = 2; i < n; i++) {
33             if(a[i] - a[i-1] > 2) {
34                 abflg = 1;
35                 break;
36             }
37         }
38         if(one < 2 || abflg) {
39             puts("No");
40             continue;
41         }
42         puts("Yes");
43     }
44     return 0;
45 }

C - What Kind of Friends Are You?

读懂题就好,每一个人的答卷是一个01串,答案也是。拿去比对,看看有没有出现,出现超过1次的。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 1110;
 5 const int maxm = 22;
 6 int n, q, c;
 7 int m;
 8 int ans[maxn];
 9 int G[maxn];
10 map<string, int> id;
11 string name[maxn];
12 char tmp[maxm];
13
14 int main() {
15     // freopen("in", "r", stdin);
16     int T, qs;
17     scanf("%d", &T);
18     while(T--) {
19         scanf("%d%d%d",&n,&q,&c);
20         id.clear();
21         memset(ans, 0, sizeof(ans));
22         memset(G, 0, sizeof(G));
23         for(int i = 1; i <= c; i++) {
24             scanf("%s", tmp);
25             id[tmp] = i;
26             name[i] = tmp;
27         }
28         for(int i = 1; i <= q; i++) {
29             scanf("%d", &m);
30             for(int j = 1; j <= m; j++) {
31                 scanf("%s", tmp);
32                 ans[id[tmp]] |= (1 << (i + 1));
33             }
34         }
35         for(int i = 1; i <= n; i++) {
36             for(int j = 1; j <= q; j++) {
37                 scanf("%d", &qs);
38                 if(qs == 1) G[i] |= (1 << (j + 1));
39             }
40         }
41         for(int i = 1; i <= n; i++) {
42             int cnt = 0;
43             int p;
44             for(int j = 1; j <= c; j++) {
45                 // cout << G[i] << " " << ans[j] << endl;
46                 if(G[i] == ans[j]) {
47                     cnt++;
48                     p = j;
49                 }
50             }
51             if(cnt != 1) puts("Let‘s go to the library!!");
52             else puts(name[p].c_str());
53         }
54     }
55     return 0;
56 }

D - Let‘s Chat

枚举a,b的所有区间,求交。长度-m+1就是那个区间的价值。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef long long LL;
 5 typedef pair<LL, LL> pll;
 6 int n, m, x, y;
 7 LL ret;
 8 vector<pll> a, b;
 9
10 bool cross(pll p, pll q, pll& ret) {
11     if(p > q) swap(p, q);
12     if(q.first <= p.second) {
13         ret.first = max(p.first, q.first);
14         ret.second = min(p.second, q.second);
15         return 1;
16     }
17     return 0;
18 }
19
20 int main() {
21     // freopen("in", "r", stdin);
22     int T;
23     pll tmp;
24     scanf("%d", &T);
25     while(T--) {
26         a.clear(); b.clear();
27         ret = 0;
28         scanf("%d%d%d%d",&n,&m,&x,&y);
29         for(int i = 0; i < x; i++) {
30             scanf("%lld%lld",&tmp.first,&tmp.second);
31             a.push_back(tmp);
32         }
33         for(int i = 0; i < y; i++) {
34             scanf("%lld%lld",&tmp.first,&tmp.second);
35             b.push_back(tmp);
36         }
37         for(int i = 0; i < a.size(); i++) {
38             for(int j = 0; j < b.size(); j++) {
39                 if(cross(a[i], b[j], tmp)) {
40                     LL len = tmp.second - tmp.first + 1;
41                     if(len >= m)
42                         ret += len - (LL)m + 1;
43                 }
44             }
45         }
46         printf("%lld\n", ret);
47     }
48     return 0;
49 }

E - Seven Segment Display

数位dp,dp(l,sum)表示l位的时候各位的价值和,已知最大的位数是8位,每位最大价值是7,所以sum不会超过56。按照每位一个16进制数存好数位dp就行,8层。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef long long LL;
 5 const int maxn = 22;
 6 const int maxm = 66;
 7 const LL up = 0xFFFFFFFF;
 8 int cost[maxn] = {6,2,5,5,4,5,6,3,7,6,6,5,4,5,5,4};
 9 LL l, r, n;
10
11 int digit[maxm];
12 LL dp[maxn][maxm];
13
14 LL dfs(int l, int sum, bool flag) {
15     if(l == 0) return (LL)sum;
16     if(!flag && ~dp[l][sum]) return dp[l][sum];
17     int pos = flag ? digit[l] : 15;
18     LL ret = 0;
19     for(int i = 0; i <= pos; i++) {
20         ret += dfs(l-1, sum+cost[i], flag&&(i==pos));
21     }
22     if(!flag) dp[l][sum] = ret;
23     return ret;
24 }
25
26 LL f(LL x) {
27     for(int i = 1; i <= 8; i++) {
28         digit[i] = x % 16;
29         x /= 16;
30     }
31     return dfs(8, 0, true);
32 }
33
34 int main() {
35     // freopen("in", "r", stdin);
36     int T;
37     scanf("%d", &T);
38     memset(dp, -1, sizeof(dp));
39     while(T--) {
40         LL ret = 0;
41         scanf("%lld %llx", &n, &l);
42         n--;
43         r = l + n;
44         if(r > up) {
45             LL mid = r % (up + 1);
46             ret = f(up) - f(l-1) + f(mid);
47         }
48         else ret = f(r) - f(l-1);
49         printf("%lld\n", ret);
50     }
51     return 0;
52 }

F - Heap Partition

贪心,维护一个数组a[]和一个set,set里维护的每一个元素分别维护了当前点作为父亲在某一个堆的序号和这个数字在数组a[]中的位置。还有一个vis数组标记每一个点的儿子数量。每读一个数a[j]就在set里找一个满足条件的a[i]>a[j]的最大的a[i]的对应set里的节点,插入后判断儿子有没有达到2,达到2则这个点就不要了。还要把它的儿子插进去。

群里问了下TLE的原因是这个题卡每一次循环的memset和clear,memset只需要memset n个点的位置就行了。把ret的vector每次输出完立刻clear就可以了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef pair<int, int> pii;
 5
 6 typedef struct Node {
 7     int pos, id, val;
 8     Node() {}
 9     Node(int n, int i, int v) : pos(n), id(i), val(v) {}
10
11 }Node;
12
13 const int maxn = 100100;
14 int n, a[maxn];
15 set<Node> s;
16 set<Node>::iterator it;
17 vector<int> ret[maxn];
18 int vis[maxn];
19
20 bool operator< (const Node& x, const Node& y) {
21     if(a[x.id] == a[y.id]) return x.id < y.id;
22     return a[x.id] < a[y.id];
23 }
24
25 int main() {
26     // freopen("in", "r", stdin);
27     int T;
28     scanf("%d", &T);
29     while(T--) {
30         scanf("%d", &n);
31         memset(vis, 0, sizeof(int)*(n+4));
32         s.clear();
33         Node tmp;
34         int tot = 0;
35         for(int i = 1; i <= n; i++) {
36             scanf("%d", &a[i]);
37             tmp.id = i; tmp.val = a[i];
38             it = s.upper_bound(tmp);
39             if(it == s.begin()) {
40                 ret[tot].push_back(i);
41                 tmp = Node(tot++, i, a[i]);
42                 s.insert(tmp);
43             }
44             else {
45                 it--;
46                 tmp = *it;
47                 vis[tmp.id]++;
48                 if(vis[tmp.id] == 2) s.erase(it);
49                 tmp.id = i;
50                 s.insert(tmp);
51                 ret[tmp.pos].push_back(i);
52             }
53         }
54         printf("%d\n", tot);
55         for(int i = 0; i < tot; i++) {
56             printf("%d", ret[i].size());
57             for(int j = 0; j < ret[i].size(); j++) {
58                 printf(" %d", ret[i][j]);
59             }
60             printf("\n");
61         }
62         for(int i = 0; i < tot; i++) ret[i].clear();
63     }
64     return 0;
65 }
时间: 2024-10-07 06:29:29

第十四届浙江省赛的相关文章

记第十四届省赛参赛体会&amp;第十三届

emmm....时间还是很久远了 还是流水账 这次比赛我还是挺开心的 因为感觉我们余神就是一把宝剑,然后我是她的Buff 前面四道题就挺顺利都1A过了,十年余神就是强无敌呀 最后两分钟过了第五题,银牌,嘿嘿嘿这最后一A我也是贡献的呀 颁奖前很紧张,不知道有没有银,出来之后超开心的 这次的队名取的超感人,因为之前赶上女生赛组队,怎么说呢 还是很感谢老师和余神 就很感性 候场的时候没地方坐,只能坐在地上,其实有一点点紧张 送上一个妖娆的打印测试 前两条来自余神和我,最后一条来自我们女队楼主 来送纸的

第五届华中区程序设计邀请赛暨武汉大学第十四届校赛 网络预选赛 A

Problem 1603 - Minimum Sum Time Limit: 2000MS   Memory Limit: 65536KB   Total Submit: 564  Accepted: 157  Special Judge: No Description There are n numbers A[1] , A[2] .... A[n], you can select m numbers of it A[B[1]] , A[B[2]] ... A[B[m]]  ( 1 <= B[

第十四届华中科技大学程序设计竞赛决赛同步赛

第十四届华中科技大学程序设计竞赛决赛同步赛 A Beauty of Trees 思维,带权并查集 题意: 长度为 n 的序列,没告诉你具体数是多少.只给出 m 个查询,表示区间 [l,r] 的异或和为 k .但是第 i 个查询如果和前面的查询有矛盾,那就是错误的.输出所有的错误查询. tags: 对于一个查询,我们知道 sum[r] ^ sum[l-1] = k . 建成图就是 r -> (l-1) ,但要快速地求出异或值,就要用带权并查集处理.如有 sum[r]^sum[l-1]=k,即 r

第14届浙江省赛--Let&#39;s Chat

Let's Chat Time Limit: 1 Second      Memory Limit: 65536 KB ACM (ACMers' Chatting Messenger) is a famous instant messaging software developed by Marjar Technology Company. To attract more users, Edward, the boss of Marjar Company, has recently added

湖南大学第十四届ACM程序设计新生杯 Dandan&#39;s lunch

Dandan's lunch Description: As everyone knows, there are now n people participating in the competition. It was finally lunch time after 3 hours of the competition. Everyone brought a triangular bread. When they were going to eat bread, some people fo

HDU 6467 简单数学题 【递推公式 &amp;&amp; O(1)优化乘法】(广东工业大学第十四届程序设计竞赛)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6467 简单数学题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 308    Accepted Submission(s): 150 Problem Description 已知 F(n)=∑i=1n(i×∑j=inCij) 求 F(n) m

2019第十四届上海国际轨道交通展览会(Rail+Metro China 2019)

第十四届上海国际轨道交通展览会(Rail+Metro China 2019) 展会概况: 由中国交通运输部支持.中国城市轨道交通协会指导的第十四届上海国际轨道交通展览会(Rail+Metro China 2019).第二届中国国际铁路与城市轨道交通大会(CIRC 2019)将于2019年11月12-14日在上海新国际博览中心再度举行.本届展会由上海申通地铁集团有限公司联合上海国展展览中心有限公司联合主办,将给新时代.新常态的中国基础设施建设行业呈现一场技术与创新交织的盛会. 关于展会: 上海国际

第二十四届全国青少年信息学奥林匹克联赛初赛 普及组C++语言试题

第二十四届全国青少年信息学奥林匹克联赛初赛 普及组C++语言试题 1.原题呈现 2.试题答案 3.题目解析 因博客园无法打出公式等,所以给你们几个小编推荐的链接去看看,在这里小编深感抱歉! https://blog.csdn.net/Lu_Anlai/article/details/85490641 https://blog.csdn.net/Ronaldo7_ZYB/article/details/83098444 来源:CSDN 编辑:疯狂的杰克 原文地址:https://www.cnblo

浙江省第十四届大学生程序设计竞赛总结

恐怖故事,开场,我从后往前读题. 看到$M$,我感觉上好像会做,但不知道是不是最优策略.跳过. 看到$L$,我感觉上好像是找规律,算了几个样例,发现可能是那个规律,没仔细思考.跳过. 这时候,$xiang578$偷偷摸摸$AC$了一题. $Occult$看了$E$题.可以写,先跳过. 紧接着,有人过题,$xiang578$看题,$Occult$把前四题剩下的三题都$AC$了. 前四题貌似是简单题,都是$1A$,最终全场$160+$队伍过了四个及以上题目. 我在一旁划水,期间看了$I$题和$F$题