IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> AtCoder Beginner Contest 234 (ABCDEF) -> 正文阅读

[C++知识库]AtCoder Beginner Contest 234 (ABCDEF)

A - Weird Function

计算规定的函数值即可

ACcode

#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll f(ll x){
	ll res = x * x + 2 * x + 3;
	return res;
}

int main(){
	
	ll t;
	cin >> t;
	ll res = f(f(f(t)+t)+f(f(t)));
	cout << res << endl;
	
	return 0;
}

B - Longest Segment

N 个点中,选两个点构成最长的线段。 O ( N 2 ) O(N^2) O(N2) 暴力计算即可。

ACcode

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn = 3e6 + 5;

double a[1005], b[1005];

double dis(int i, int j){
	double len = (a[i] - a[j]) * (a[i] - a[j]);
	len += (b[i] - b[j]) * (b[i] - b[j]);
	return len;
}

int main(){
	
	int n;
	cin >> n;
	for(int i = 1; i <= n; i++) cin >> a[i] >> b[i];
	
	double res = 0;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			double tmp = dis(i, j);
			if(tmp > res) res = tmp;
		}
	}
	
	printf("%.10lf\n", sqrt(res));
	
	return 0;
}

C - Happy New Year!

本质就是计算 k 的二进制表示,注意把 ’1‘ 变成 ’2‘

ACcode

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int main(){
	
	ll k;
	cin >> k;
	
	string res = "";

	while(k){
		if(k&1) res = "2" + res;
		else res = "0" + res;
		k >>= 1;
	}	
	
	cout << res << endl;
	
	return 0;
}

D - Prefix K-th Max

依次输出序列前 i i i ( k < = i < = n ) (k <= i <= n) (k<=i<=n)的第 k k k 大。
用树状数组统计那个数字出现过,二分找第 k 大出现的数字。
ps:维护方法很多只要把前 k 大保留下来即可。

#include<bits/stdc++.h>
#include<queue>
#define ll long long
using namespace std;

const int maxn = 3e6 + 5;

int lowbit(int A){
	return A & (-A);
}

int a[maxn];
int t[maxn];
void add(int A){
	while(A < maxn){
		t[A]++;
		A += lowbit(A);
	}
}

int query(int A){
	int res = 0;
	while(A > 0){
		res += t[A];
		A -= lowbit(A);
	}
	return res;
}

int main(){
	
	int n, k;
	cin >> n >> k;
	for(int i = 1; i <= n; i++) cin >> a[i];
	
	for(int i = 1; i < k; i++) add(a[i]);
	for(int i = k; i <= n; i++){
		add(a[i]);
		int pos = i - k + 1;
		int l = 1, r = n, res = -1;
		while(l <= r){
			int mid = l + r >> 1;
			if(query(mid) >= pos){
				res = mid;
				r = mid - 1;
			}
			else l = mid + 1;
		}
		cout << res << endl;
	}
	
	return 0;
}

E - Arithmetic Number

找到第一个大于等于 X 且满足要求的数字(每个数位等差)。
枚举第一位数是什么和公差是多少即可。时间复杂度: O ( 9 ? 19 ? 17 ) O(9 * 19 * 17) O(9?19?17)

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn = 3e6 + 5;

ll a[1005];
ll b[1005];

ll len, num = 0, res = 1e18;
void dfs(ll d, ll ai, ll now, ll step){
	if(step == len){
		if(now >= num && now < res) res = now; 
		return;
	}
	ll tmp = ai + d;
	if(tmp < 0 || tmp > 9) return;
	now = now * 10 + tmp;
	dfs(d, tmp, now, step+1);
}

int main(){
	
	string s;
	cin >> s;
	
	len = s.size();
	for(int i = 0; i < len; i++) a[i] = s[i] - '0';
	for(int i = 0; i < len; i++) num = num * 10 + a[i];
	
	for(int i = 1; i <= 9; i++){
		for(int j = -9; j <= 9; j++){
			dfs(j, i, i, 1);
		}
	}
	
	cout << res << endl;
		
	
	return 0;
}

F - Reordering

计算字符串 S 的全部非空子序列的全排列组成的字符串的种类。
定义: d p i , j dp_{i,j} dpi,j? 表示前 i 个字符构成长度为 j 的字符串的种类数
转移方程为: d p i , j = d p i ? 1 , j ? k ? C ( j , k ) , i < = 26 , k < = 第 i 种 字 符 出 现 的 次 数 dp_{i,j} = dp_{i-1,j-k} * C(j, k), i <= 26, k <= 第i种字符出现的次数 dpi,j?=dpi?1,j?k??C(j,k),i<=26,k<=i

#include<bits/stdc++.h>
#include<queue>
#define ll long long
using namespace std;

const int maxn = 5000 + 5;
const ll mod = 998244353;

ll f[maxn], inv[maxn];
ll dp[27][maxn];
int v[27];

ll qpow(ll a, ll b){
	ll res = 1;
	while(b){
		if(b&1) res *= a;
		res %= mod;
		a *= a;
		a %= mod;
		b >>= 1;
	}
	return res;
}

ll C(ll n, ll m){
	return f[n] * inv[m] % mod * inv[n-m] % mod;
}

int main(){
	
	f[0] = inv[0] = 1;
	for(int i = 1; i <= 5000; i++) f[i] = f[i-1] * i % mod;
	for(int i = 1; i <= 5000; i++) inv[i] = qpow(f[i], mod-2);
	
	string s;
	cin >> s;	
	
	int len = s.size();
	for(int i = 0; i < len; i++) v[s[i]-'a'+1]++;
	dp[0][0] = 1;
	for(int i = 1; i <= 26; i++){
		for(int j = 0; j <= len; j++){
			for(int k = 0; k <= min(j, v[i]); k++){
				dp[i][j] += dp[i-1][j-k] * C(j, k) % mod;
				dp[i][j] %= mod;
			}
		}
	}
	
	ll ans = 0;
	for(int i = 1; i <= len; i++) ans += dp[26][i], ans %= mod;
	cout << ans << endl;	
		
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-11 23:48:36  更:2022-01-11 23:48:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:02:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码