题目链接: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 }
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 }
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 }
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 }
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 }