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
原文地址:https://www.cnblogs.com/JHSeng/p/11322901.html