非正经题解 | ACGO欢乐赛#50
2025-07-01 08:57:11
发布于:浙江
求各位大佬赞一下,顶一下
求精华帖+置顶
前言————————————————————————————————————————————————————————
这是我Molly第次写题解。。。
正文—————————————————————————————————————————————————————————
难度:红红红红红黄
T1:50!
本题超级无敌简单, 只考输出
print(""" """)
print("""###.###
#...#.#
###.#.#
..#.#.#
###.###""")
(我认为 更简单,于是我就只呈现 代码)
本题是数学题,因为题目说要求得剩余面积最大值 竖直道路宽度要最小 求数组最小值
伪代码:(求数组最小值)
int min=b[0];
for (int i=0 ; i<q ; i++){
if (b[i]<min) min=b[i];
}
要求得剩余面积,使用公式 :
#include <bits/stdc++.h>
using namespace std;
int b[100009];
int main(){
int n,m,a,q;
cin >> n >> m >> a >> q;
for (int i=0 ; i<q ; i++) cin >> b[i];
int min=b[0];
for (int i=0 ; i<q ; i++){
if (b[i]<min) min=b[i];
}
cout << (n*m-(min*n+a*m-min*a));
return 0;
}
本题就是考分支结构,分别进行比较——输了,赢了,平局不变
(此题无需多说)
#include <bits/stdc++.h>
using namespace std;
int a[100009],b[100009];
int sum=0;
int main(){
int n;
cin >> n;
for (int i=0 ; i<n ; i++) cin >> a[i];
for (int i=0 ; i<n ; i++) cin >> b[i];
for (int i=0 ; i<n ; i++){
if (a[i]>b[i]) sum+=3;
else if (a[i]==b[i]) sum=sum;
else sum-=3;
}
cout << sum;
return 0;
}
T4:小明和藏宝库
此题可以使用容器来做——
①:输入个整数n和m,n表示集合数量,m表示每个集合的元素个数
②:初始化第一个集合st,读取m个元素并存入set中(set会自动去重和排序)
③:对于后续n-1个集合,每个集合都先存入临时set cut中
④:通过遍历当前交集集合st,检查元素是否存在于cut中(使用count()方法),将共同元素存入new_st
⑤:用new_st更新st作为新的交集集合
⑥:如果中途发现交集集合为空(st.empty()),提前终止循环
⑦:最终输出交集集合的大小st.size()
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
set<int>st;
for (int j = 0; j < m; j++) {
int x;
cin >> x;
st.insert(x);
}
for (int i = 1; i < n; i++) {
set<int>cut;
for (int j = 0; j < m; j++) {
int x;
cin >> x;
cut.insert(x);
}
set<int> new_st;
for (int x : st) {
if (cut.count(x) > 0) {
new_st.insert(x);
}
}
st = new_st;
if (st.empty()) break;
}
cout << st.size() << endl;
return 0;
}
T5:指针夹角
①:读取两个整数a(小时)和b(分钟)
②:计算分角度:
mi = b * 6.0;
(每分钟分针走6度)
③:计算时针角度:
h = a * 30.0 + b * 0.5;
(每小时时针走30度,每分钟走0.5度)
④:计算角度差绝对值:
d = abs(mi - h);
⑤:取最小角度:
an = min(d, 360.0 - d);
(因为时钟是圆形,超过180度时取反向角度)
⑥:输出:
printf("%.2f",an);
(保留两位小数输出结果)
#include <bits/stdc++.h>
using namespace std;
int main() {
int a,b;
cin >> a >> b;
double mi=b * 6.0;
double h=a * 30.0 + b * 0.5;
double d = abs(mi - h);
double an = min(d, 360.0 - d);
printf("%.2f",an);
return 0;
}
①:输入处理:
:首先读取参赛人数n
:为每个参赛者初始化id、解题数(solved)和罚时(penalty)数组
②:解题记录处理:
:对每个参赛者,读取其解题记录数m
:使用first_ac数组记录每道题首次AC的时间
:使用wrong_count数组记录每道题在首次AC前的错误提交次数
③:计算得分:
:遍历13道题目(b从1到13)
:如果某题有AC记录(first_ac[b] != -1),则:
:解题数solved[i]加1
:罚时penalty[i]增加AC时间first_ac[b]和错误提交次数*15
④:排序逻辑:
· 使用自定义排序规则:
:优先按解题数降序
:解题数相同则按罚时升序
:都相同则按id升序
⑤:输出结果:
按照排序后的顺序输出参赛者id,用空格分隔
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> id(n);
vector<int> solved(n, 0);
vector<int> penalty(n, 0);
for (int i = 0; i < n; i++) {
id[i] = i + 1;
int m;
cin >> m;
vector<int> first_ac(14, -1);
vector<int> wrong_count(14, 0);
for (int j = 0; j < m; j++) {
int a, b, c;
cin >> a >> b >> c;
if (c == 1 && first_ac[b] == -1) {
first_ac[b] = a;
} else if (c == 0 && first_ac[b] == -1) {
wrong_count[b]++;
}
}
for (int b = 1; b <= 13; b++) {
if (first_ac[b] != -1) {
solved[i]++;
penalty[i] += first_ac[b] + wrong_count[b] * 15;
}
}
}
vector<int> idx(n);
for (int i = 0; i < n; i++) idx[i] = i;
sort(idx.begin(), idx.end(), [&](int x, int y) {
if (solved[x] != solved[y]) return solved[x] > solved[y];
if (penalty[x] != penalty[y]) return penalty[x] < penalty[y];
return id[x] < id[y];
});
for (int i = 0; i < n; i++) {
cout << id[idx[i]];
if (i < n - 1) cout << " ";
}
cout << endl;
return 0;
}
谢谢观看以后尽量继续写
别忘了点赞+关注哦
全部评论 4
d
2025-07-12 来自 浙江
0顶
2025-07-12 来自 浙江
0d
2025-07-04 来自 浙江
0顶
2025-07-04 来自 浙江
0
有帮助,赞一个