文章目录
- A: Paper Watering
- E: Checksum
- L: Bracket Generation
- I: password(待补)
A: Paper Watering
解题思路:
该题很简单,但有一个需要考虑到的,就是当一个数 n 不是完全平方数的时候,那么他执行 1 操作之后再执行 2 操作之后,所得到的值和之前的不同,那么就需要再进行处理。
解题代码:
void Solved() { int n, k; cin >> n >> k;int ans = 0;if(n == 1){cout << 1 << endl;return ;}int temp = 0;while(n != 1 && temp < k) {temp ++;int t = (int)sqrt(n);ans ++;if(t * t != n && t != 1) ans += k - temp;n = t;}cout << ans + k + 1 << endl;
}
E: Checksum
解题思路:
该题看到时间复杂度可以看出来是用的遍历,对k进行枚举,然后进行判断就行了。该题可以用到bitset,代码更简洁。
解题代码:
void solve() {int n,k;cin >> n >> k;int len = 0;for(int i = 1; i<= n; i++){char a; cin >> a;if(a == '1') len ++;}for(int i = 0; i <= k; i++){int sum = len + i;bitset<32> d(sum);int dd = 0;for(int j = 0; j < k; j ++ ) if(d[j] == 1) dd ++;if(dd == i) {for(int j = k - 1; j >= 0; j -- ) {cout << d[j];} cout << endl;return ;} }cout << "None" << endl;
}
L: Bracket Generation
解题思路:
该题赛时没写出来。。。当时就想着怎么进行排列了,没想到顺序这回事。
因为这只有两种情况:
- 在序列后加一个括号
- 选取合法的括号,将其中括号包裹住。
那么括号的排列是有一定的顺序的,就比如那个最小的括号一定是在包裹它的括号后面,如下图所示:
就上图,该图中那前两个1一定是在第一个2的后面,前四个1一定是在第二个2的前面,这个顺序是固定的,那么只要满足前面1的顺序,后面的2在后面的顺序就可以随便放了。
解题代码:
void solve() {string str;cin >> str;vector<int> vec;vector<int> a;for(int i = 0; i < str.size(); i++){if(str[i] == ')' && str[i - 1] == '('){a.push_back(1);}else if(str[i] == ')'){a.push_back(2);}}reverse(a.begin(),a.end());int res = 1,cnt = 0;for(int i = 0; i < a.size(); i++){cnt ++;if(a[i] == 2){res = res * cnt % mod;}}cout << res << endl;
}
I: password(待补)
解题思路:
解题代码: