zoukankan      html  css  js  c++  java
  • 2019牛客暑期多校训练营 第七场

    题目链接:https://ac.nowcoder.com/acm/contest/887#question


    A:

    一开始还讨论了很多种情况,后来直接敲了暴力A了。

     1 /* Nowcoder Contest 887
     2  * Problem A
     3  * Au: SJoshua
     4  */
     5 #include <stack>
     6 #include <cstdio>
     7 #include <vector>
     8 #include <string>
     9 #include <iostream>
    10 #include <algorithm>
    11 
    12 using namespace std;
    13 
    14 bool isPerfect(string str) {
    15     // cout << "judge " << str << endl;
    16     string mk = str + str;
    17     vector <string> strs;
    18     strs.push_back(str);
    19     for (int i = 1; i < str.length(); i++) {
    20         string s = mk.substr(i, str.length());
    21         strs.push_back(s);
    22         if (s == str) {
    23             break;
    24         }
    25     }
    26     sort(strs.begin(), strs.end());
    27     return *strs.begin() == str;
    28 }
    29 
    30 string concat(vector <string> list, string con) {
    31     string ret = list[0];
    32     for (auto i = 1; i < list.size(); i++) {
    33         ret += con;
    34         ret += list[i];
    35     }
    36     return ret;
    37 }
    38 
    39 int main(void) {
    40     int T;
    41     cin >> T;
    42     while (T--) {
    43         string input, cur, str, head, tail, tmp;
    44         vector <string> ans;
    45         cin >> input;
    46         int left = 0, right = 0;
    47         for (left = 0; left < input.length() && input[left] == '1'; left++);
    48         for (right = input.length() - 1; right >= 0 && input[right] == '0'; right--);
    49         for (int i = 0; i < left; i++) head += input[i];
    50         for (int i = left; i <= right; i++) str += input[i];
    51         for (int i = right + 1; i < input.length(); i++) tail += input[i];
    52         int readingOne = false;
    53         if (!head.empty()) {
    54             ans.push_back(head);
    55         }
    56 
    57         vector <string> bits;
    58         for (auto ch : str) {
    59             if (ch == '0') {
    60                 if (readingOne) {
    61                     bits.push_back(tmp);
    62                     tmp.clear();
    63                     readingOne = false;
    64                 }
    65             } else if (ch == '1') {
    66                 if (!readingOne) {
    67                     readingOne = true;
    68                 }
    69             }
    70             tmp += ch;
    71         }
    72         bits.push_back(tmp);
    73 
    74         int cnt = 0;
    75         while (cnt < bits.size()) {
    76             for (int i = bits.size() - 1; i >= cnt; i--) {
    77                 string tst;
    78                 for (int j = cnt; j <= i; j++) {
    79                     tst += bits[j];
    80                 }
    81                 if (isPerfect(tst)) {
    82                     if (!tst.empty()) ans.push_back(tst);
    83                     cnt = i + 1;
    84                 }
    85             }
    86         }
    87 
    88         if (!tail.empty()) {
    89             ans.push_back(tail);
    90         }
    91         cout << concat(ans, " ") << endl;
    92     }
    93     return 0;
    94 }
    Code via. Sjoshua

    B:

    题目只对系数作出了约束。本质就是判函数有没有根,虚根也算。显然n>=3 no。n==2时判delta即可。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 
     5 using namespace std;
     6 const int maxn = 2000;
     7 long long  A[maxn];
     8 int main() {
     9     int T;
    10     scanf("%d", &T);
    11     while (T--) {
    12         int n;
    13         scanf("%d", &n);
    14         for (int i = 0; i <= n; i++) {
    15             cin >> A[i];
    16         }
    17         if (n >= 3) {
    18             printf("No
    ");
    19         } else {
    20             if (n == 2) {
    21                 long long dx = A[1] * A[1] - 4 * A[0] * A[2];
    22                 if (dx < 0) {
    23                     printf("Yes
    ");
    24                 } else {
    25                     printf("No
    ");
    26                 }
    27             } else {
    28                 printf("Yes
    ");
    29             }
    30         }
    31     }
    32     return 0;
    33 }
    Code via. rsqppp

    C:

    枚举每种树,线段树维护每种树的总花费即可。

      1 /* basic header */
      2 #include <bits/stdc++.h>
      3 /* define */
      4 #define ll long long
      5 #define dou double
      6 #define pb emplace_back
      7 #define mp make_pair
      8 #define sot(a,b) sort(a+1,a+1+b)
      9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
     10 #define rep0(i,a,b) for(int i=a;i<b;++i)
     11 #define eps 1e-8
     12 #define int_inf 0x3f3f3f3f
     13 #define ll_inf 0x7f7f7f7f7f7f7f7f
     14 #define lson (curpos<<1)
     15 #define rson (curpos<<1|1)
     16 /* namespace */
     17 using namespace std;
     18 /* header end */
     19 
     20 const int maxn = 1e5 + 10;
     21 struct Tree {
     22     int height, cost, number, index;
     23     void input() {
     24         scanf("%d%d%d", &height, &cost, &number);
     25     }
     26 } tree[maxn];
     27 
     28 bool cmp1(Tree n1, Tree n2) {
     29     return n1.cost < n2.cost;
     30 }
     31 
     32 bool cmp2(Tree n1, Tree n2) {
     33     return n1.height < n2.height;
     34 }
     35 
     36 struct Node {
     37     int l, r;
     38     ll num, sum = 0;
     39 } segt[maxn * 3];
     40 
     41 void maintain(int curpos) {
     42     if (segt[curpos].l == segt[curpos].r) return;
     43     segt[curpos].num = segt[curpos << 1].num + segt[curpos << 1 | 1].num;
     44     segt[curpos].sum = segt[curpos << 1].sum + segt[curpos << 1 | 1].sum;
     45 }
     46 
     47 void build(int curpos, int curl, int curr) {
     48     segt[curpos].l = curl; segt[curpos].r = curr;
     49     segt[curpos].num = segt[curpos].sum = 0;
     50     if (curl == curr) return;
     51     int mid = curl + curr >> 1;
     52     build(curpos << 1, curl, mid); build(curpos << 1 | 1, mid + 1, curr);
     53 }
     54 
     55 void add(int curpos, int index, int cost, int number) {
     56     if (segt[curpos].l == index && segt[curpos].r == index) {
     57         segt[curpos].num += number;
     58         segt[curpos].sum += (ll)cost * number;
     59         return;
     60     }
     61     int mid = segt[curpos].l + segt[curpos].r >> 1;
     62     if (index <= mid) add(curpos << 1, index, cost, number);
     63     else add(curpos << 1 | 1, index, cost, number);
     64     maintain(curpos);
     65 }
     66 
     67 ll query(int curpos, ll num) {
     68     if (num <= 0) return 0;
     69     if (num >= segt[curpos].num)
     70         return segt[curpos].sum;
     71     if (segt[curpos].l == segt[curpos].r)
     72         return segt[curpos].sum / segt[curpos].num * num;
     73     return query(curpos << 1, num) + query(curpos << 1 | 1, num - segt[curpos << 1].num);
     74 }
     75 
     76 int main() {
     77     int n;
     78     while (~scanf("%d", &n)) {
     79         ll ans = 0;
     80         rep0(i, 0, n) {
     81             tree[i].input();
     82             ans += (ll)tree[i].cost * tree[i].number; // calculate total cost
     83         }
     84         sort(tree, tree + n, cmp1); // sort by cost
     85         rep0(i, 0, n) tree[i].index = i + 1;
     86         build(1, 1, n); // build an empty tree
     87         sort(tree, tree + n, cmp2); // sort by height
     88         ll totNum = 0, numOfTallestTree = tree[0].number, res = ans - (ll)tree[0].number * tree[0].cost; // re num of tree
     89         int j = 0;
     90         rep1(i, 1, n) { // enum every tree as the tallest one
     91             if (i == n || tree[i].height != tree[i - 1].height) { // if the height is not equal
     92                 ll tmp = query(1, totNum - numOfTallestTree + 1) + res;
     93                 ans = min(ans, tmp);
     94                 numOfTallestTree = tree[i].number;
     95                 if (i < n)
     96                     while (j < i) {
     97                         add(1, tree[j].index, tree[j].cost, tree[j].number);
     98                         totNum += tree[j++].number;
     99                     }
    100             } else numOfTallestTree += tree[i].number;
    101             if (i < n) res -= (ll)tree[i].cost * tree[i].number;
    102         }
    103         printf("%lld
    ", ans);
    104     }
    105     return 0;
    106 }
    View Code

    D:

    比较p和n的长度,不足补0即可。

     1 /* Nowcoder Contest 887
     2  * Problem D
     3  * Au: SJoshua
     4  */
     5 #include <cstdio>
     6 #include <vector>
     7 #include <string>
     8 #include <iostream>
     9 #include <algorithm>
    10 
    11 using namespace std;
    12 
    13 int main(void) {
    14     int n;
    15     string p;
    16     cin >> n >> p;
    17     if (p.length() > n) {
    18         cout << "T_T" << endl;
    19         return 0;
    20     }
    21     cout << p;
    22     for (int i = p.length(); i < n; i++) {
    23         cout << 0;
    24     }
    25     cout << endl;
    26     return 0;
    27 }
    Code via. Sjoshua

    J:

    模拟题。

     1 /* basic header */
     2 #include <bits/stdc++.h>
     3 /* define */
     4 #define ll long long
     5 #define dou double
     6 #define pb emplace_back
     7 #define mp make_pair
     8 #define sot(a,b) sort(a+1,a+1+b)
     9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
    10 #define rep0(i,a,b) for(int i=a;i<b;++i)
    11 #define eps 1e-8
    12 #define int_inf 0x3f3f3f3f
    13 #define ll_inf 0x7f7f7f7f7f7f7f7f
    14 #define lson (curpos<<1)
    15 #define rson (curpos<<1|1)
    16 /* namespace */
    17 using namespace std;
    18 /* header end */
    19 
    20 ll f(ll x) {
    21     vector<int>v; v.clear();
    22     while (x) {
    23         v.pb(x % 10); x /= 10;
    24     }
    25     int _size = v.size();
    26     ll ret = 0;
    27     for (int i = 0; i < _size; i++) ret = ret * 10 + v[i];
    28     return ret;
    29 }
    30 
    31 int main() {
    32     int t; scanf("%d", &t);
    33     while (t--) {
    34         ll a, b; scanf("%lld%lld", &a, &b);
    35         printf("%lld
    ", f(f(a) + f(b)));
    36     }
    37     return 0;
    38 }
    View Code
  • 相关阅读:
    【Leetcode】155: 最小栈(Python)
    【深入理解计算机系统】 八:AVR汇编语言
    【深入理解计算机系统】 七:AVR指令集架构
    【深入理解计算机系统】 六:AVR架构和运行环境
    nginx+lua 记一次特殊字符导致"丢包"问题
    python2.7 升级到 python3.6
    神奇的 SQL 之擦肩而过 → 真的用到索引了吗
    神奇的 SQL 之 HAVING → 容易被轻视的主角
    Delphi
    Windows authentication in linux docker container(转发)
  • 原文地址:https://www.cnblogs.com/JHSeng/p/11322901.html
Copyright © 2011-2022 走看看