本弱坤只做出来了 4道。
加油吧
F传送门
(补题)Codeforces Round #847 (Div. 3) F(根号分治)_弱---的博客-CSDN博客
A题
签到题,找出π的多少前缀相同即可,O(n);
#include <bits/stdc++.h>
using namespace std;
string p = "314159265358979323846264338327";
void solve(){
string s; cin >> s;
int n = s.length();
int ans = 0;
for(int i = 0; i < n; i++){
if(p[i] != s[i]) break;
ans++;
}
cout << ans << '\n';
}
int main(){
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t; cin >> t;
while(t--){
solve();
}
return 0;
}
B题,
题目大意,给你n个骰子,拿走一个最大值(相当于限定死最大值),给你当前总和和目标总和
让你任意一个满足序列输出
考虑贪心,第一个想法 :当前能拿最大那就拿最大,不行换下一个。
第二个想法:将剩余值 均分,差多少往某几个骰子加上去即可。
这里我是采用第一个
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n, s, r; cin >> n >> s >> r;
vector <int> ans;
int k = s - r;
ans.emplace_back(k);
int last = k;
for(int i = 1; i <= n - 1; i++){
int x = last;
for(int x = last; x >= 1; x--){
if(r - x >= (n - 1 - i) * 1){
ans.emplace_back(x);
r -= x;
last = x;
break;
}
}
}
for(auto x : ans){
cout << x << ' ';
}
cout << '\n';
}
int main(){
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t; cin >> t;
while(t--){
solve();
}
return 0;
}
这道题题意是每次给你一个残缺序列,让你凑出一个完整序列,考虑第一个完整序列的第一个数,你会发现除开被删去,那么剩余所有情况都得是第一位出现。
思路一,将第一位 k 找出来,然后去寻找第一位不是 k 的残序列找出来,加上去输出即可
#include <bits/stdc++.h>
using namespace std;
int a[110][110], b[110];
void solve(){
int n; cin >> n;
memset(b, 0, sizeof(b));
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n - 1; j++){
cin >> a[i][j];
if(j == 1){
b[a[i][j]]++;
}
}
}
int ma = 0, pos = 0;;
for(int i = 105; i >= 1; i--){
if(b[i] > ma){
ma = b[i];
pos = i;
}
}
// 可以用max_element 代替
for(int i = 1; i <= n; i++){
if(a[i][1] != pos){
cout << pos << ' ';
for(int j = 1; j <= n - 1; j++) cout << a[i][j] << ' ';
cout << '\n';
return;
}
}
}
int main(){
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t; cin >> t;
while(t--){
solve();
}
return 0;
}
思路二,赛后看 tourist代码,大概看出来一点东西,好像类似于深度?
对于原序列每一位,他只会前移一位,或者不变,令坐标为 pos;
那么 他的坐标和 = (n - 1) * pos + (pos - 1);
也就是有序了。。。
%%%
转载自 t神比赛代码
/**
* author: tourist
* created: 27.01.2023 18:33:08
**/
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int tt;
cin >> tt;
while (tt--) {
int n;
cin >> n;
vector<int> sum(n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - 1; j++) {
int x;
cin >> x;
--x;
sum[x] += j;
}
}
vector<int> p(n);
iota(p.begin(), p.end(), 0);
sort(p.begin(), p.end(), [&](int i, int j) {
return sum[i] < sum[j];
});
for (int i = 0; i < n; i++) {
cout << p[i] + 1 << " \n"[i == n - 1];
}
}
return 0;
}
套娃问题,从当前情况最小数考虑,特殊的是必须的严格递增的,而且是差距为1
对于每一个最小值,对答案的贡献就是他的数量,这应该很好想,那么我们应该做的就是,对于每一个最小数,应该尽可能的插入多的瓶子。
我们处理好第一小的瓶子 a 好后,我们应该考虑的是,第二个瓶子 b 的贡献度,如果
a >= b 那么是不是所有的瓶子b都会被装在a中,所有贡献度为0;
a < b; 只有一部分被装入a,那么剩余部分就是当前的最小值,那么贡献度,则为(a - b)
同理去考虑第三小瓶子,很明显是类似的。
进行上述步骤思考即可
#include <bits/stdc++.h>
using namespace std;
map <int , int> mp;
void solve(){
int n; cin >> n;
vector <int> a(n);
mp.clear();
for(auto &x : a){
cin >> x;
mp[x]++;
}
int last = -1, ans = 0, val = 0;;
for(auto [x, y] : mp){
if(x != last + 1) ans += y;
else ans += max(0, y - val);
last = x;
val = y;
}
cout << ans << '\n';
}
int main(){
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t; cin >> t;
while(t--){
solve();
}
return 0;
}
E.
在比赛中,我过多的考虑了我之前的结论导致我g了,应该从基本的一位一位考虑!
手推了一遍
显然在连续存在两位1的时候无法操作
#include <bits/stdc++.h>
using namespace std;
int b[35];
void solve(){
int x; cin >> x;
if(x & 1){
cout << -1 << '\n';
return ;
}
int last = 0, a = 0, b = 0;
for(int i = 0; i < 30; i++){
if(x >> i & 1){
if(last){
cout << -1 << '\n';
return;
}else{
a |= (1 << i);
a |= (1 << (i - 1));
b |= (1 << (i - 1));
}
}
last = (x >> i & 1);
}
cout << a << ' ' << b << '\n';
}
int main(){
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t; cin >> t;
while(t--){
solve();
}
return 0;
}
FG往后再补