AtCoder Beginner Contest 226

A. 四舍五入

题意:给定一个小数,四舍五入到附近的整数

将小数点前和小数点后的数读入并判断小数点后的数是否 ≥ 500 \geq 500 500 即可

#include
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
using namespace std;

set> st;

int main(void) {
	vector 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
using namespace std;
typedef long long ll;

const int N = 2e5 + 5;
int a[N], t, k, n, vis[N];
vector 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) (xjxi,yjyi),那么最基础的应该怎么求呢,或者说这个向量最小应该是什么呢

g = gcd ⁡ ( x j − x i , y j − y i ) g = \gcd(x_j - x_i, y_j - y_i) g=gcd(xjxi,yjyi),那么基础向量即 (

你可能感兴趣的:(AtCoder,c++,acm竞赛,编程语言)