赛时出了三题,还是太菜了, d d d赛后结论也推了半天, d d d题 r a t i n g 1300 rating1300 rating1300,果然我还是不配上 1200 1200 1200,菜就多练哎
A
#include<bits/stdc++.h>
using namespace std;
void solve() {
int n;cin >> n;
int a = 97, b = 97, c = 97;
n -= 3;
while (c < 122 && n != 0) {
n--;c++;
}
while (b < 122 && n != 0) {
n--;b++;
}
while (a < 122 && n != 0) {
n--;a++;
}
printf("%c%c%c\n", a, b, c);
}
int main() {
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}
B
CodeforcesCodeforcesBetter设置
| In English По-русски
qustflypiggy | Logout
HOMETOPCATALOGCONTESTSGYMPROBLEMSETGROUPSRATINGEDUAPICALENDARHELP
PROBLEMSSUBMIT CODEMY SUBMISSIONSSTATUSHACKSSTANDINGSCUSTOM INVOCATION
General
# Author Problem Lang Verdict Time Memory Sent Judged
246158797 Contestant:
qustflypiggy 1931B - 13 GNU C++20 (64) Accepted 31 ms 1568 KB 2024-02-13 18:05:18 2024-02-14 12:26:55 Add to favourites Compare
→ SourceCopy
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve() {
int n;cin >> n;
vector<int>a(n + 3);
int sum = 0;
for (int i = 1;i <= n;i++) {
cin >> a[i];
sum += a[i];
}
int p = sum / n;
int nm = 0;
for (int i = n;i >= 1;i--) {
if (a[i] < p)nm += p - a[i];
else if (a[i] > p) {
nm -= a[i] - p;
if (nm < 0) {
cout << "NO" << '\n';
return;
}
}
}
cout << "YES" << '\n';
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}
C
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve() {
int n;cin >> n;
int m = n;
vector<int>b(n + 3), bb(n + 3);
for (int i = 1;i <= n;i++) {
cin >> b[i];
bb[i] = b[i];
}
sort(bb.begin() + 1, bb.begin() + 1 + n);
if (bb[1] == bb[n]) {
cout << 0 << '\n';
return;
}
int numb = 1;int nume = 1;
int i = 1;
while (b[i] == b[i + 1])numb++, i++;
i = n;
while (b[i] == b[i - 1])nume++, i--;
if (b[1] == b[n]) {
cout << n - numb - nume << '\n';
return;
}
cout << n - max(numb, nume) << '\n';
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}
D
题目大意
给定整数 x , y x,y x,y( x , y x,y x,y可能相等),给定有 n n n个元素的数组 a a a,定义特殊索引 < i , j > <i,j> <i,j>以下两个条件均满足
- a [ i ] + a [ j ] a[i]+a[j] a[i]+a[j]可被 x x x整除
- a [ i ] − a [ j ] a[i]-a[j] a[i]−a[j]可被 y y y整除
问数组内特殊索引的对数
思路
- ( a − b ) (a-b) (a−b) % y = 0 y=0 y=0,所以 a a a % y = b y=b y=b % y y y
-
(
a
+
b
)
(a+b)
(a+b) %
x
=
0
x=0
x=0
[ ( a [(a [(a % x ) + ( b x)+(b x)+(b % x ) ] x)] x)] % x = 0 x=0 x=0
( a (a (a % x ) + ( b x)+(b x)+(b % x ) = x 或 0 x)=x或0 x)=x或0
( a (a (a % x ) x) x)和 ( b (b (b % x ) x) x)互补或者都为 0 0 0
所以用 m a p map map对应起来数字关系,读取累加就完事了
ACcode
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve() {
int n, x, y;cin >> n >> x >> y;
map<pair<int, int>, int>mp;
mp.clear();
int ans = 0;
for (int i = 1;i <= n;i++) {
int v;cin >> v;
ans += mp[{(x - v % x) % x, v% y}];//前者括起来再对x取余是因为要顾及到若v是1导致括号为0的情况
mp[{v% x, v% y}]++;
}
cout << ans << '\n';
}
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}
E
题目大意
给定 n n n个元素的数组 a a a,给定整数 m m m,先手选择一个数并把他从头到尾颠倒(如24变为42,注意,前导0会被去掉),后手选择两个数 b , c b,c b,c,并在数组内添加 b c , c b bc,cb bc,cb并删除 b 和 c b和c b和c,问,假定两人均决策最优,当只剩一个数的时候,是否大于 1 0 m 10^m 10m
思路
显然先手最优选是每次选后缀 0 0 0最多的数颠倒,后手也是选最多的要保护起来,所以统计后缀 0 0 0并记录到数组里,累加删除后缀 0 0 0的数量,最后判断是否位数大于 m m m就行
ACcode
#include<bits/stdc++.h>
using namespace std;
void solve() {
int n, m;cin >> n >> m;
vector<int>a;
int ans = 0;
a.clear();
for (int i = 1;i <= n;i++) {
int b;cin >> b;
int num = 0;
bool flag = true;
while (b) {
if (flag && b % 10 == 0)num++;
else flag = false;
ans++;
b /= 10;
}
a.push_back(num);
}
sort(a.begin(), a.end());
int ret = 0;
for (int i = a.size() - 1;i >= 0;i--) {
if ((a.size() - 1 - i) % 2 == 0)ret += a[i];
}
if (ans - ret > m)cout << "Sasha" << '\n';
else cout << "Anna" << '\n';
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}