码迷,mamicode.com
首页 > 其他好文 > 详细

第十四届浙江省赛

时间:2017-04-25 19:59:11      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:pen   条件   div   names   长度   mem   最大   tle   ems   

  题目真的是从易到难的顺序,而且跨度非常合理,只是看到榜单上后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 }

 

第十四届浙江省赛

标签:pen   条件   div   names   长度   mem   最大   tle   ems   

原文地址:http://www.cnblogs.com/kirai/p/6763784.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!