
Practice.
A. Working Week
题意
给定
输出
思路
显然,我们可以在第二个点做上标记,这样就可以让差值尽可能大。
那么,我们来考虑剩下那个点。因为对称性,我们不妨令
很明显,
如果前者更小,那就需要满足
如果后者更小,那就需要满足
所以,答案就是
时间复杂度:
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n;
cin >> n;
cout << n / 3 - 2 << '\n';
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while(t --) solve();
}
其实也可以猜出来(x
B. Tea with Tangerines
题意
给定长度为
思路
首先,我们先设最小那段为
那么,答案就是
显然,我们希望尽可能减少切割次数,也就是说至少有一段是不用切的。
那么,升序排序
时间复杂度:
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n;
cin >> n;
int ans = 0, a0;
cin >> a0;
for(int i=1;i<n;i++){
int cur;
cin >> cur;
ans += (cur - 1) / (2 * a0 - 1);
}
cout << ans << '\n';
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while(t --) solve();
}
有点抽象
C. Phase Shift
题意
给定一个由大写字母组成的字符串,构造一个字符串映射,满足映射对应的有向图为一个包含
输出映射后字典序最小的结果。
思路
我们可以暴力枚举每一位,对于该位,如果我们并没有创建映射,我们就暴力按字母表顺序枚举所有字母,找出第一个没有被创建且和原字母不一样的字母并创建映射;如果创建了映射,我们直接使用该映射即可。
时间复杂度:
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define fs first
#define sc second
const int N = 2e5 + 10, inf = 0x3f3f3f3f3f3f3f3f, mod = 1e9 + 7;
void init(){}
void solve() {
int n;
string t;
cin >> n >> t;
vector<int> e(26, -1), re(26, -1);
for(int i=0;i<n;i++){
int cur = t[i] - 'a';
if(e[cur] == -1) {
for (int j = 0; j < 26; j++) {
if (re[j] == -1) {
int last = j, cnt = 0;
while (e[last] != -1) last = e[last], cnt++;
if (last != cur || cnt == 25) {
e[cur] = j, re[j] = cur;
break;
}
}
}
}
t[i] = (char) (e[cur] + 'a');
}
cout << t << '\n';
}
signed main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
init();
int t = 1;
cin >> t;
while(t --) solve();
}
就很暴力(x
D. Meta-set
题意
给定
若一个 由
输出序列的所有五元组中 有至少两个好三元组 的个数。
思路
(题意还是介绍得有点绕,可以去看原题的样例)
首先,数据量并不大,
记录完后,我们直接枚举所有序列,对于对应的个数
时间复杂度:
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define fs first
#define sc second
const int N = 2e5 + 10, inf = 0x3f3f3f3f3f3f3f3f, mod = 1e9 + 7;
void init(){}
void solve() {
int n, k;
cin >> n >> k;
vector<vector<int>> a(n, vector<int>(k));
for(int i=0;i<n;i++)
for(int j=0;j<k;j++)
cin >> a[i][j];
map<vector<int>, int> cnt;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++){
vector<int> need(k);
for(int t=0;t<k;t++){
need[t] = a[i][t] == a[j][t] ? a[i][t] : 3 - a[i][t] - a[j][t];
}
cnt[need] ++;
}
int ans = 0;
for(int i=0;i<n;i++){
if(cnt[a[i]] >= 2) ans += cnt[a[i]] * (cnt[a[i]] - 1) / 2;
}
cout << ans << '\n';
}
signed main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
init();
int t = 1;
//cin >> t;
while(t --) solve();
}
有点像状压