暑期cspj模拟赛1
已结束
ACM/ICPC
开始于: 2025-7-16 16:15
24
小时
主持人:
6
暑期cspj模拟赛1
T1
显然第i个位置会被变换n+1-i次,所以最后的值, 另一个问题是最终会在哪里.从倒着来看,可以发现 在第一个位置,在倒数第一个位置位置,在第二个位置,在倒数第二个位置, 显然我们找到了规律.按照n->1,左右轮着放就行.
#include<bits/stdc++.h>
using namespace std;
int n;
int s[2000010]; //s用来存储原序列
int ans[2000010]; //ans用来存储答案序列
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s[i];
s[i] = (s[i] + n + 1 - i) % 2; // 这是每个位置最终的值
}
// 现在找每个位置 最终所在的位置
int left = 1, right = n;
bool isleft = true;
for (int i = n; i >= 1; i--) {
if (isleft) {
ans[left] = s[i];
left++;
}else {
ans[right] = s[i];
right--;
}
isleft = !isleft;
}
for (int i = 1; i <= n; i++) {
cout << ans[i] << " "; //输出答案即可
}
return 0;
}
T2
过于简单,不解释了
#include <bits/stdc++.h>
using namespace std;
const int c=200005;
int n, bal, jobb, cnt, t[c];
void solve() {
cin >> n;
for (int i=1; i<=n; i++) {
cin >> t[i];
}
bal=t[1], jobb=t[n], cnt=2;
while (2*bal<jobb) {
int maxi=bal;
for (int i=1; i<=n; i++) {
if (t[i]>maxi && t[i]<=2*bal) {
maxi=t[i];
}
}
if (maxi==bal) {
cout << -1 << "\n";
return;
}
cnt++;
bal=maxi;
}
cout << cnt << "\n";
}
int main() {
ios_base::sync_with_stdio(false);
int w;
cin >> w;
while (w--) {
solve();
}
}
T3
显然最终形成的是一个手拉手的环,遍历每一个排列,取最小修改值即可.
#include<bits/stdc++.h>
using namespace std;
int p[10], inf = 1000000000;
int vis[10][10];
int n, m, ans = inf;
int main() {
ios::sync_with_stdio(false), cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
vis[u][v] = 1;
vis[v][u] = 1;
}
for (int i = 1; i <= n; i++) {
p[i] = i;
}
do {
int cans = m;
for (int i = 1; i <= n; i++) {
cans += vis[p[i]][p[i % n + 1]]?-1:1;
}
ans = min(ans, cans);
}
while (next_permutation(p + 1, p + n + 1));
cout << ans << '\n';
return 0;
}
T4
- 状态
- 已结束
- 规则
- ACM/ICPC
- 题目
- 4
- 开始于
- 2025-7-16 16:15
- 结束于
- 2025-7-17 16:15
- 持续时间
- 24 小时
- 主持人
- 参赛人数
- 6