AtCoder Beginner Contest 194

A I Scream

int main()
{
	IOS;
	int a, b;	
	cin >> a >> b;
	if(a + b >= 15 && b >= 8) puts("1");
	else if(a + b >= 10 && b >= 3) puts("2");
	else if(a + b >= 3) puts("3");
	else puts("4");
	return 0;
} 

B

int n;
int a[N], b[N];

int main()
{
	scanf("%d", &n);
	int res = INF;
	for(int i = 1; i <= n; ++ i) 
	{
		scanf("%d%d", &a[i], &b[i]);
		res = min(res, a[i] + b[i]);
	}
	for(int i = 1; i <= n; ++ i)
		for(int j = 1; j <= n; ++ j)
			if(i != j) res = min(max(a[i], b[j]), res);
	printf("%d
", res);
	return 0;
} 

C Squared Error

(sumlimits_{i=2}^Nsumlimits_{j=1}^{i-1}(A_i-A_j)^2) = (sumlimits_{i=1}^NA_i^2 * (N - 1) - sumlimits_{i=2}^NA_isumlimits_{j=1}^{i - 1}2 * A_j)
用前缀和优化后复杂度 (O(n))

int n;
int a[N], sum[N];

int main()
{
	scanf("%d", &n);
	LL res = 0;
	for(int i = 1; i <= n; ++ i) 
	{
		scanf("%d", &a[i]);
		res += (LL)a[i] * a[i] * (n - 1);
		res -= (LL)sum[i - 1] * a[i] * 2;
		sum[i] = sum[i - 1] + a[i];
	}
	printf("%lld
", res);
	return 0;
} 

D Journey

令当前已经访问过的顶点集合为 (S), 下一次能使得 (|S|) 增加 (1) 的概率为 (dfrac{N - |S|}{N}), 首中即停止,符合几何分布,已知几何分布的期望是 (dfrac{1}{p}), 故期望是 (sumlimits_{i = 1}^{n - 1}dfrac{N}{N - i})

int n;

int main()
{
	cin >> n;
	double res = 0;
	for(int i = 1; i < n; ++ i) res += (double)n / i;

	printf("%.10lf
", res);
	return 0;
} 

E Mex Min Editorial

对于相同的两个数 (x),如果它们之间的距离大于 (M),则代表有一段长度为 (M) 的区间中没有 (x), (x)则可以作为答案
为了处理边界情况,在 (0)(n + 1) 的位置上放置每一个数

int n, m;
int last[N];

int main()
{
	scanf("%d%d", &n, &m);
	int res = INF;

	for(int i = 1; i <= n; ++ i)
	{
		int x; 
		scanf("%d", &x);
		if(i - last[x] > m) res = min(x, res);
		last[x] = i;
	}
	for(int i = 0; i <= n; ++ i)
		if(n + 1 - last[i] > m) 
			res = min(i, res);
	printf("%d
", res);
	return 0;
}

F Digits Paradise in Hexadecimal

(f[i][j]) 为前 (i) 位选了 (j) 种的方案数,且选出的方案都严格小于上界
当上一位未达到上界时:
(f[i + 1][j] += f[i][j] * j)
(f[i + 1][j + 1] += f[i][j] * (16 - j))
因为要处理前导零,所以从 (0) 转移要特殊处理:
(f[i + 1][1] += f[i][0] * 15)
(f[i + 1][0] += f[i][0])
再统计上一位达到上界时,当前位取 (0) ~ (v[i] - 1) 的贡献
最后特判掉所有位都取到上界是否符合题意

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

#define IOS ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)

const int P = 1e9 + 7;
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int N = 3e6 + 10;

int main()
{
	IOS;
	int n;
	string str;
	vector<int> v;
	cin >> str >> n;

	for(auto x : str)
		if(x >= '0' && x <= '9') v.push_back((int)(x - '0'));
		else v.push_back((int)(10 + x - 'A'));
	
	vector<vector<int> > f(str.size() + 1, vector<int>(18, 0));
	
	int state = 0;
	for(int i = 0; i < (int)str.size(); ++ i)
	{
		for(int j = 1; j <= 16; ++ j)
		{
			f[i + 1][j] = (f[i + 1][j] + (LL)f[i][j] * j % P) % P;
			f[i + 1][j + 1] = (f[i + 1][j + 1] + (LL)f[i][j] * (16 - j) % P) % P;
		}
		f[i + 1][1] = (f[i + 1][1] + (LL)f[i][0] * 15 % P) % P;
		f[i + 1][0] = (f[i + 1][0] + f[i][0]) % P;
		for(int j = 0; j < v[i]; ++ j)
		{
			int nstate = state;
			if(i || j) nstate |= (1 << j);
			f[i + 1][__builtin_popcount(nstate)] += 1;
		}
		state |= (1 << v[i]);
	}

	int res = f[str.size()][n] + (__builtin_popcount(state) == n);
	cout << res << endl;
	
	return 0;
} 
原文地址:https://www.cnblogs.com/ooctober/p/14492751.html