A. 四舍五入
题意:给定一个小数,四舍五入到附近的整数
将小数点前和小数点后的数读入并判断小数点后的数是否 ≥ 500 \geq 500 ≥500 即可
#include<bits/stdc++.h>
using namespace std;
int main(void) {
int a, b;
scanf("%d.%d", &a, &b);
if (b >= 500) a++;
cout << a << endl;
return 0;
}
B. 简单数据结构
题意:给定若干个数组,输出去重后有多少个数组
集合里面存数组即可,最后输出集合的大小
#include<bits/stdc++.h>
using namespace std;
set<vector<int>> st;
int main(void) {
vector<int> now;
int n, l;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> l;
now.resize(l);
for (int j = 0; j < l; j++) {
cin >> now[j];
}
st.insert(now);
}
cout << st.size() << endl;
return 0;
}
C. dfs 遍历
题意:给定一个学习的拓扑序,输出完成最后一个任务所需的总时间
因为每次只能完成一个任务,所以只需要知道完成最后一个任务需要哪些前置条件即可
反向建图 + dfs一遍即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
int a[N], t, k, n, vis[N];
vector<int> nxt[N];
void dfs(int now) {
vis[now] = 1;
for (auto it: nxt[now]) {
if (vis[it]) continue;
dfs(it);
}
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> t >> k;
a[i] = t;
for (int j = 1, u; j <= k; j++) {
cin >> u;
nxt[i].push_back(u);
}
}
dfs(n);
ll ans = 0;
for (int i = 1; i <= n; i++) {
if (vis[i]) ans += a[i];
}
cout << ans << endl;
return 0;
}
D. 标准化向量
题意:给定 N N N 个小镇的坐标,寻找一个向量集合使得任取两个小镇,都存在一个向量,使得两镇可以互相到达
对于两个小镇 ( x i , y i ) (x_i, y_i) (xi,yi) 和 ( x j , y j ) (x_j, y_j) (xj,yj),其可达的向量为 ( x j − x i , y j − y i ) (x_j - x_i, y_j - y_i) (xj−xi,yj−yi),那么最基础的应该怎么求呢,或者说这个向量最小应该是什么呢
令 g = gcd ( x j − x i , y j − y i ) g = \gcd(x_j - x_i, y_j - y_i) g=gcd(xj−xi,yj−yi),那么基础向量即 (