Codeforces Round #726 (Div. 2)
作者:互联网
又是天崩开局…
- 题意:给定一个数字序列,求至少往里面加入多少个非负整数就能使整个序列的算术平均值为1
- 思路:将数字序列求和得到sum,以sum与n的关系分类讨论
- 首先,当sum < n时,只需要添加一个n - sum + 1即可
- 其次,当sum >= n时,只需要添加sum - n个0即可
- 代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t, n, m;
inline void solve() {
cin >> n;
ll sum = 0;
for(int i = 1; i <= n; i++) {
ll x; cin >> x;
sum += x;
}
if(sum < n) cout << 1 << endl;
else cout << sum - n << endl;
return ;
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> t;
while(t--) {
solve();
}
return 0;
}
- 题意:将两个球放两个位置上,问怎么走(捡到球再回去)才能使路径最远。
- 思路:对顶角即可,最短距离都是这个矩形的周长
- 代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
const ll N = 1e6 + 10;
ll t, n, m, x, y;
inline void solve() {
cin >> n >> m >> x >> y;
cout << 1 << " " << 1 << " " << n << " " << m << endl;
return ;
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> t;
while(t--) {
solve();
}
return 0;
}
-
题意:
给定一个数字序列,求满足以下两点要求的新组合的数字序列,要求如下:1.首尾的绝对值差最小,2.数字序列难度最大(x[i] >= x[i - 1],那么难度贡献值+1)。 -
思路:
首先将数字序列排序,找到相差最小的两项作为头部尾部,其次从除头尾的剩余数字中找到第一个比头元素大的,依次输出,最后再把未输出的元素挨着输出一遍。 -
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
const ll N = 1e6 + 10;
ll t, n, m, x[N];
inline void solve() {
cin >> n;
int flag = 0;
for(int i = 1; i <= n; i++) cin >> x[i];
sort(x + 1, x + n + 1);
int st, ed, now = 0x3f3f3f3f3f3f3f;
for(int i = 2; i <= n; i++) {
if(x[i] - x[i - 1] < now) {
st = i - 1;
ed = i;
now = x[i] - x[i - 1];
}
}
vector<int> ans;
int ok1 = 0, ok2 = 0;
cout << x[st] << " ";
for(int i = 1; i <= n; i++) {
if(ok1 == 0 && x[i] == x[st]) {
ok1 = 1; continue;
}
if(ok2 == 0 && x[i] == x[ed]) {
ok2 = 1; continue;
}
ans.push_back(x[i]);
}
if(n > 2) {
int pos = 0;
for(int i = 0; i < ans.size(); i++)
if(ans[i] > x[st]) {
pos = i; break;
}
for(int i = pos; i < ans.size(); i++) cout << ans[i] << " ";
for(int i = 0; i < pos; i++) cout << ans[i] << " ";
}
cout << x[ed] << endl;
return ;
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> t;
while(t--) {
solve();
}
return 0;
}
-
思路:打表找规律
-
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t, n, m;
inline void solve() {
cin >> n;
if(n % 2 == 1) {
cout << "Bob" << endl;
return ;
}
int cnt = 1;
for(; pow(2, cnt) <= n; cnt+=2) {
if(pow(2, cnt) == n) {
cout << "Bob" << endl;
return ;
}
}
cout << "Alice" << endl;
return ;
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> t;
while(t--) {
solve();
}
return 0;
}
-
题意:给定一个字符串,通过删除字符串的最后一个字符或者复制该字符串,找到长度恰好为k的按字典顺序最小的字符串
-
思路:首先找到字典序最小的循环节,由于只能从后开始删除,所以开头必须保留,这样就得到思路,找到该循环节即可。
-
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
string s; int k, n; cin >> n >> k >> s;
int now = 0, ans = 0;
for(int i = 1; i < s.size(); i++) {
if(s[i] > s[now]) break;
else if(s[i] == s[now]) now++;
else {
ans = i;
now = 0;
}
}
now = 0;
while(k--) {
cout << s[now];
if(now == ans) now = 0;
else now++;
}
return 0;
}
- 思路代码:同上
标签:int,ll,Codeforces,long,cin,726,Div,now,sum 来源: https://blog.csdn.net/a12311weq/article/details/118058306