• 第十四届浙江省赛


      题目真的是从易到难的顺序,而且跨度非常合理,只是看到榜单上后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
    ", 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
    ", 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
    ", 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("
    ");
    61         }
    62         for(int i = 0; i < tot; i++) ret[i].clear();
    63     }
    64     return 0;
    65 }
  • 相关阅读:
    八月最后的一天
    Go语言系列一
    一个工具libre draw
    Linux启动eclipse报错找不到java环境解决方法
    P2P通讯初步实现
    C#中,当鼠标移动到控件上,动态显示提示内容 ToolTip
    在windows64位的系统上面操作操作excel程序出现异常
    office2007下载地址
    蜗牛算法
    利用vs自带工具分析程序性能
  • 原文地址:https://www.cnblogs.com/kirai/p/6763784.html
Copyright © 2020-2023  润新知