首页 > 其他分享 >AtCoder Beginner Contest 324

AtCoder Beginner Contest 324

时间:2023-10-15 16:33:25浏览次数:43  
标签:AtCoder string Beginner 10 int db mid long 324

D - Square Permutation
须知:最大的平方数的平方一定小于等于10n,平方数最多为10(n/2)(因为再大会越界)
因为要求的数一定是原数的排列组合,所以它们的元素和对应的元素个数一定相同
所以只要判断平方数的字符串是否与原字符串相等即可(这里可以利用排序判断)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 5e5 + 10;
int a[13];
int main() {
	int ans = 0, n;
	string s;
	cin >> n >> s;
	sort(s.begin(),s.end());
	long long mx = pow(10, n);
	for (LL i = 0;  i * i < mx; i++) {
		string t = to_string(i * i);//将数字转换成字符串
		t.resize(n, '0');//补全,使得与s的长度相等
		sort(t.begin(), t.end());
		if (t == s) ans++;//判断
	}
	cout << ans;
	return 0;
}

E - Joint Two Strings
注意:可以不连续,只要里面有t的所有字符就行

思路:
1.记录s[i]包含t的前后缀数
2.如果i,j满足,则i的前缀+j的后缀>=t.size
3.累加ans
如此简单

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 5e5 + 10;
string s[N], t;
int a[N], c[N], b[N];
int bu_f(string s1) {
	int k = 0;
	for (auto c : s1) {//注意可以不连续
		if (k >= t.size()) break;
		if (c == t[k]) k++;
	}
	return k;
}
int main() {
	int n;
	cin >> n >> t;
	for (int i = 1; i <= n; i++) cin >> s[i];
	for (int i = 1; i <= n; i++) a[i] = bu_f(s[i]);//记录t的前缀数
	reverse(t.begin(), t.end());//翻转
	for (int i = 1; i <= n; ++i) {
		reverse(s[i].begin(), s[i].end());//翻转与t对应
		b[i] = bu_f(s[i]);
		c[b[i]]++;//记录s[i]包含t的后缀数
	}
	LL ans = 0;
	for (int i = 1; i <= n; i++) {
		int l = max((int)(t.size() - a[i]),0);//前缀还缺的数,可能会有负数,特判0
		for (int j = l; j <= t.size(); j++) {
			ans += c[j];
		}
	}
	cout << ans;
	return 0;
}

F - Beautiful Path
注意:如果TLE可能是开的太小或太大
分数规划经典题
设b为美观和,c为代价和,b/c>=k,求k的最大值
转换成b-kc>=0或kc-b<=0
1.可以把边的权值转换成最长路或者最短路的模板
2.二分求k值
注意:因为u<=v,DAG(有向无环图),可以dp直接枚举
如此简单?

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define db  double
const int N = 2e5 + 10;
int n, m;
struct node {
	int to, b, c;
};
vector<node> g[N];
db dp[N];
const db esp = 1e-11;//开的太小把自己坑死
bool check(db x) {
	for (int i = 1; i <= n; i++) dp[i] = -1e12;
	dp[1] = 0;
	for (int i = 1; i <= n; i++) {//暴力枚举
		for (auto v : g[i]) {
			db w=v.b-v.c*x;
			dp[v.to] = max(dp[v.to], dp[i] + w);//最长路
		}
	}
	return dp[n] >= 0;
}
int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int u, v,  b,c;
		cin >> u >> v >> b >> c;
		g[u].push_back({ v,b,c });
	}
	db l = 0, r = 1e10;
	while (r-l>esp) {
		db mid = (r + l) / 2;
		if (check(mid)) l = mid;
		else r = mid;
	}
	printf("%.10lf", l);
	return 0;
}
结束了

标签:AtCoder,string,Beginner,10,int,db,mid,long,324
From: https://www.cnblogs.com/bu-fan/p/17765458.html

相关文章

  • AtCoder Beginner Contest 324 DF题题解
    比赛链接D-SquarePermutation其实比较简单,但是比赛时候脑子不转了,竟然在尝试枚举全排列,然后算了一下复杂度直接不会做了。正解应该是枚举完全平方数,底数枚举到\(sqrt(10^{14})\)即可,因为n最大为13。然后统计一下这个完全平方数各个数字出现了多少个,和读入的比较一下是......
  • ABC324题解
    A/B赛时没打。C暴力判断是相等s[i]==t还是替换了一个字符,或者是添加/删除了一个字符。最后两个判断只需要交换一下\(s\)和\(t\)的顺序就可以共用一个函数了。D注意到\(N\le13\),所以平方数不会超过\(v=10^{13}\),很容易想到暴力枚举\(\sqrtv\)以内的数,判断是否......
  • ABC324总结
    ABC324solved:CDErating:UnratedC:7min(+1)D:7minE:9minCconstintN=2e5+5;\(\rightarrow\)constintN=5e5+5;。。。F01分数规划,没学过。后:就是二分答案加上推式子啊。G一眼主席树上二分。但是没调出来。码力\(\downarrow\)\(\downarrow\)\(\do......
  • ABC324F Beautiful Path
    给出一张DAG,每条边有两种边权\(b\)与\(c\),求一条从\(1\)到\(n\)的路径,问路径经过的边的\(\dfrac{\sumb}{\sumc}\)的最大值是多少。\(n,m\le2\times10^5\)。这不是经典01分数规划吗?将题目中的要求写成如下形式:\[\begin{aligned}&\text{Maximize}\dfrac......
  • Atcoder Beginner Contest 324 F Beautiful Path 题解-分数规划
    为了更好的阅读体验,请点击这里分数规划小技巧:尽可能将式子写成存在某种取值,使得不等式成立的形式。不然可能需要绕几个弯才能想出来。题目链接题目大意:给出一个DAG,每条边有一个\(b_i,c_i\),保证从编号小的边向编号大的边连边,且\(1\)到\(n\)必有路径,求\(1\)到\(n\)......
  • AtCoder Beginner Contest 321 C-321-like Searcher
    可以观察到0-9的所有子集都能恰组成一个满足题目条件的数字,所以共有1022个数{除空集和0}方法就是二元枚举,找出所有数然后排序。#include<iostream>#include<cstdio>#include<vector>#include<algorithm>usingnamespacestd;usingll=longlong;vector<ll>v;sig......
  • Atcoder beginner constest319 Minimum Width
    因为要求窗口的最小宽度,当宽度为w时满足条件,那么宽度为w+1时也满足条件,有此可见是有单调性的,那么可以用二分搜的方法,且此题目一定有解。因为M最大为2乘以10的5次方,Li最大为10的9次方,所以宽度最大为2乘以10的14次方,单词每次间隔1,所以这里设成10的17次方。之后就是套二分模板解暴力......
  • AtCoder Regular Contest 166
    Preface上周末因为上课而且这天下午还有CF要打,所以就没现场打这场ARC了这两天事情也特别多导致写题的时间很少,摸了好久总算是补了四个题A-ReplaceCorSwapAB感觉是我做法复杂了,怎么A题码量好大首先我们找到所有\(Y\)中为\(C\)的位置,显然对应的\(X\)中的位置也必须为\(C......
  • 题解 AtCoder wtf22_day1_b【Non-Overlapping Swaps】
    题解AtCoderwtf22_day1_b【Non-OverlappingSwaps】problem给定一个排列,要求交换最多\(n-1\)对元素,使得这个排列变成[1,2,...,n]的有序排列。当然没有那么简单,对于交换还是有限制的,对于相邻的两次交换,不妨叫做\((l_i,r_i)\)和\((l_{i+1},r_{i+1})\),必须满足这两个交......
  • Atcoder Grand Contest 016 E - Poor Turkeys
    先思考这样一个问题:对于一只火鸡\(i\),我们应该如何判断它最后是否能活下来。如果我们正着判断,我们其实并没有足够的证据表明每一次操作我们应该保留哪只火鸡,也就没法判断最终的答案。但是如果我们倒着考虑,我们发现,如果最后一次操作的两个火鸡都不是\(i\),那么这次操作选啥对答案......