Educational Codeforces Round 127 (Rated for Div. 2)
文章目录
A.String Building
题意: 给定字符串s,问s能否由aa、aaa、bb、bbb四种字符串构成
思路: 不能出现单个a或者单个b
AC代码:
#include <iostream>
#include <bits/stdc++.h>
#define x first
#define y second
#define int long long
#define pb push_back
#define rep(i, a, b) for(int i = a; i < b; i ++ )
#define per(i, a, b) for(int i = b - 1; i >= a; i -- )
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int INF = 0x3f3f3f3f;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-6;
const int PI = acos(-1);
typedef vector<int> VI;
typedef pair<int, int> PII;
const int N = 100000 + 10;
inline int lowbit(int x) {return x & (-x);}
int powmod(int a,int k, int p) {int res=1;a%=p; assert(k>=0); for(;k;k>>=1){if(k&1)res=res*a%p;a=a*a%p;}return res;}
signed main() {
fio;
int _; cin >> _; while (_ -- ) {
string s; cin >> s;
int i = 0;
bool flag = true;
while (i < s.size()) {
int j = i + 1;
while (j < s.size() && s[j] == s[i]) j ++ ;
if (j - i < 2) {
flag = false;
break;
}
i = j;
}
cout << (flag == true ? "YES\n" : "NO\n");
}
return 0;
}
B. Consecutive Points Segment
题意: 一维坐标系上有n个点,可以执行如下操作任意次:选点一个点xi,可以使xi = xi - 1或者xi + 1。问能否使给定的n个点变为在x轴上连续的一段。
思路1: n个数有n - 1个间隔,对间隔的长度进行分类讨论d = a[i] - a[i - 1]
- d > 3,直接
go die - d == 3,只能有一个,并且不能有d==2的区间。
- d== 2, 最多有两个
AC代码:
#include <iostream>
#include <bits/stdc++.h>
#define x first
#define y second
#define int long long
#define pb push_back
#define rep(i, a, b) for(int i = a; i < b; i ++ )
#define per(i, a, b) for(int i = b - 1; i >= a; i -- )
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int INF = 0x3f3f3f3f;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-6;
const int PI = acos(-1);
typedef vector<int> VI;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
inline int lowbit(int x) {return x & (-x);}
int powmod(int a,int k, int p) {int res=1;a%=p; assert(k>=0); for(;k;k>>=1){if(k&1)res=res*a%p;a=a*a%p;}return res;}
signed main() {
fio;
int _; cin >> _; while(_ -- ) {
int n; cin >> n;
vector<int> v(n);
for (auto &x : v) cin >> x;
bool flag = true;
int d1 = 0, d2 = 0, d3 = 0;
for (int i = 1; i < n; i ++ ) {
int d = v[i] - v[i - 1];
if(d == 1) d1 ++ ;
else if(d == 2) d2 ++ ;
else if(d == 3) d3 ++ ;
else {
flag = false;
break;
}
}
if(d3 > 1) flag = false;
if(d2 > 2) flag = false;
if(d3 && d2) flag = false;
cout << (flag == true ? "YES\n" : "NO\n");
}
return 0;
}
思路2: 每个数ai都减去i,相当于消去了位置上的差异,题目变为所有数能否都变为一个数
AC代码:
#include <iostream>
#include <bits/stdc++.h>
#define x first
#define y second
#define int long long
#define pb push_back
#define rep(i, a, b) for(int i = a; i < b; i ++ )
#define per(i, a, b) for(int i = b - 1; i >= a; i -- )
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int INF = 0x3f3f3f3f;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-6;
const int PI = acos(-1);
typedef vector<int> VI;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
inline int lowbit(int x) {return x & (-x);}
int powmod(int a,int k, int p) {int res=1;a%=p; assert(k>=0); for(;k;k>>=1){if(k&1)res=res*a%p;a=a*a%p;}return res;}
signed main() {
fio;
int _; cin >> _; while(_ -- ) {
int n; cin >> n;
vector<int> v(n);
for (auto &x : v) cin >> x;
for(int i = 0; i < v.size(); i ++ )
v[i] -= i;
int minn = *min_element(v.begin(), v.end());
int maxn = *max_element(v.begin(), v.end());
cout << (maxn - minn <= 2 ? "YES\n" : "NO\n");
}
return 0;
}
C. Dolce Vita
题意: 初始给定n包糖果的价格,每过一天糖果的价格会增加1,每天有固定的钱,问最终可以买到多少糖果。
思路: 贪心的思想,先买最便宜的,所以排序+前缀和,计算该物品一共可以买几天。
AC代码:
#include <iostream>
#include <bits/stdc++.h>
#define x first
#define y second
#define int long long
#define pb push_back
#define rep(i, a, b) for(int i = a; i < b; i ++ )
#define per(i, a, b) for(int i = b - 1; i >= a; i -- )
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int INF = 0x3f3f3f3f;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-6;
const int PI = acos(-1);
typedef vector<int> VI;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
inline int lowbit(int x) {return x & (-x);}
int powmod(int a,int k, int p) {int res=1;a%=p; assert(k>=0); for(;k;k>>=1){if(k&1)res=res*a%p;a=a*a%p;}return res;}
int n, x;
int a[N];
int s[N];
signed main() {
fio;
int _; cin >> _; while(_ -- ) {
cin >> n >> x;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
sort(a + 1, a + 1 + n);
for (int i = 1; i <= n; i ++ ) s[i] = s[i - 1] + a[i];
int ans = 0;
for (int i = 1; i <= n; i ++ ) {
if (s[i] <= x) {
ans += (x - s[i]) / i + 1;
}
else {
break;
}
}
cout << ans << endl;
}
return 0;
}
D. Insert a Progression
题意: 给定n个数和m个数,将m个数插入到这n个数中,如何插入,可以使得最终的相邻两位差的绝对值之和最小。
思路: 判断插在首段和末端以及最值旁边三种情况下的最优解。
AC代码:
#include <iostream>
#include <bits/stdc++.h>
#define x first
#define y second
#define int long long
#define pb push_back
#define rep(i, a, b) for(int i = a; i < b; i ++ )
#define per(i, a, b) for(int i = b - 1; i >= a; i -- )
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int INF = 0x3f3f3f3f;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-6;
const int PI = acos(-1);
typedef vector<int> VI;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
inline int lowbit(int x) {return x & (-x);}
int powmod(int a,int k, int p) {int res=1;a%=p; assert(k>=0); for(;k;k>>=1){if(k&1)res=res*a%p;a=a*a%p;}return res;}
int n, x;
int a[N];
signed main() {
fio;
int _; cin >> _; while(_ -- ) {
cin >> n >> x;
int minn = INF, maxn = -1;
for(int i = 0; i < n; i ++ ) {
cin >> a[i];
minn = min(minn, a[i]);
maxn = max(maxn, a[i]);
}
int res = 0;
for(int i = 1; i < n; i ++ ) res += abs(a[i] - a[i - 1]);
if(x > maxn) res += min({abs(a[0] - x), abs(a[n - 1] - x), 2 * (x - maxn)});
if(1 < minn) res += min(abs(a[0] - 1), min(abs(a[n-1] - 1), 2 * (minn - 1)));
cout << res << endl;
}
return 0;
}
总结: 拒接摆烂!