首页 > 其他分享 >ABC-279解题报告

ABC-279解题报告

时间:2023-03-01 16:46:19浏览次数:45  
标签:ABC frac int double sqrt Bg 解题 long 279

比赛传送门

C. RANDOM

题意:给你两个 01 矩阵 \(S,T\),问是否可以将 \(S\) 以列为单位重新排列得到 \(T\)。

判断 \(S,T\) 的每列是否可以一一对应即可

做法一

以列为单位提取成字符串,\(S,T\) 分别排序比较即可。

By cxm1024

#include<bits/stdc++.h>
using namespace std;
string s[400010],t[400010];
signed main() {
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) {
		string x;
		cin>>x;
		for(int j=1;j<=m;j++)
			s[j]+=x[j-1];
	}
	for(int i=1;i<=n;i++) {
		string x;
		cin>>x;
		for(int j=1;j<=m;j++)
			t[j]+=x[j-1];
	}
	sort(s+1,s+m+1);
	sort(t+1,t+m+1);
	for(int i=1;i<=m;i++)
		if(s[i]!=t[i]) {
			cout<<"No"<<endl;
			return 0;
		}
	cout<<"Yes"<<endl;
	return 0;
}

做法二

将每列哈希成一个数,排序后比较即可。

By maspy

void solve() {
  LL(H, W);
  vc<u64> base(H);
  FOR(i, H) base[i] = RNG_64();
  vc<u64> A(W), B(W);

  FOR(i, H) {
    STR(S);
    FOR(j, W) if (S[j] == '#') A[j] += base[i];
  }
  FOR(i, H) {
    STR(S);
    FOR(j, W) if (S[j] == '#') B[j] += base[i];
  }
  sort(all(A));
  sort(all(B));
  Yes(A == B);
}

D. Freefall

题意:一个小球下落时间为 \(\frac{A}{\sqrt{g}}\),初始时 \(g=1\),每次可以花费 \(B\) 的时间将 \(g\) 增加 \(1\),问最小总时间。

题意转化为求 \(\frac{A}{\sqrt{x+1}}+Bx\) 的最小值。

做法一

容易证明该函数为一个下凸函数,所以可以使用三分法。

By cxm1024

#include<bits/stdc++.h>
using namespace std;
signed main() {
	long long a,b;
	cin>>a>>b;
	long long l=0,r=1e18;
	auto check=[&](long long x) {
		return (long double)a/sqrt(x+1)+x*b;
	};
	while(l+2<r) {
		long long lmid=(l*2+r)/3,rmid=(l+r*2)/3;
		if(check(lmid)>check(rmid)) l=lmid;
		else r=rmid;
	}
	long double ans=1e18;
	for(long long i=l;i<=r;i++)
		ans=min(ans,check(i));
	printf("%.7Lf\n",ans);
	return 0;
}

做法二

找最小值相当于这个函数的导数等于 \(0\),而下凸函数的导函数单调上升,所以可用二分求解。

实际计算中,只需要计算 \(f(x)-f(x-1)\),粗略地将其作为导数的近似来二分即可。

By Kude

a, b = map(int, input().split())
l = -1
r = 10 ** 18

def f(c):
    return c * b + a / (1 + c) ** 0.5

while r - l > 2:
    c1 = (l + r) // 2
    c2 = c1 + 1
    if f(c1) <= f(c2):
        r = c2
    else:
        l = c1

print(f'{min(f(l + 1), f(l + 2)):.10f}')

做法三

考虑答案关于 \(g\) 的函数 \(f(g)=\frac{A}{\sqrt{g}}+B(g-1)\),由于最小值与常数无关,所以可以看成 \(f(g)=\frac{A}{\sqrt{g}}+Bg\),则由均值不等式:

\[\begin{aligned} f(g)&=\frac{A}{\sqrt{g}}+Bg\\ &=\frac{A}{2\sqrt{g}}+\frac{A}{2\sqrt{g}}+Bg\\ &=\frac{\frac{3A}{2\sqrt{g}}+\frac{3A}{2\sqrt{g}}+3Bg}{3}\\ &\ge\sqrt[3]{\frac{3A}{2\sqrt{g}}\cdot \frac{3A}{2\sqrt{g}}\cdot 3Bg}\\ &=3\sqrt[3]{\frac{A^2B}{4}} \end{aligned} \]

由此可知函数最小值不会小于 \(3\sqrt[3]{\frac{A^2B}{4}}\),取等条件为 \(\frac{A}{2\sqrt{g}}=Bg\),即 \(g=(\frac{A}{2B})^\frac{2}{3}\)。

By EternalAlexander

#include <bits/stdc++.h>
const long double eps = 1e-10;
using ldb = long double;
using ll = long long;
ldb a,b;
long double calc(long double x) {
	return x * b + (long double) a / std::sqrt(1 + x);
}

int main() {
	std::cin >> a >> b;
	long double x = pow( a / (2 * b) , 2.0 / 3 ) - 1;
	ll x1 = x;
	long double ans = a;
	for (ll p = x1 - 10; p <= x1 + 10; ++ p) ans = std::min(ans,calc(p));
	printf("%.10Lf",ans);
	return 0;
}

标签:ABC,frac,int,double,sqrt,Bg,解题,long,279
From: https://www.cnblogs.com/cxm1024/p/17168383.html

相关文章

  • ABC-288解题报告
    比赛传送门D.RangeAddQuery题意:有一个序列\(A\)和正整数\(k\),每次询问给定\(l,r\),你可以在\([l,r]\)内选择一段长度为\(k\)的子段,统一加减,问是否能将\([l,r......
  • ABC-271解题报告
    C.Manga题意:有一本书有\(n\)卷,你需要从第一卷开始依次看,一旦没有某一卷就停止。在看之前你可以进行若干次操作,每次卖掉任意两卷并买新的任意一卷。问操作结束后最多能......
  • AGC-059解题报告
    比赛传送门A.MyLastABCProblem题意:有一个只含ABC字符串\(s\),每次询问一段区间\([l,r]\),问至少需要多少次操作能将这段区间变得完全相同。每次操作可以选一段区......
  • ABC275D-Yet-Another-Recursive-Function题解
    题目传送门题意:定义一个\(\mathbb{N}\to\mathbb{N}\)的函数\(f(x)=\begin{cases}1&x=0\\f(\lfloor\frac{x}{2}\rfloor)+f(\lfloor\frac{x}{3}\rfloor)&\text{otherwis......
  • CFR-826-Div-3解题报告
    F.Multi-ColoredSegments题意:数轴上有\(n\)个线段,每个区间有一个颜色\(c\),对于每个线段,求与它颜色不同的线段中与它的最短距离。距离定义为两个线段中的点集最近的......
  • CFR-832-Div-2解题报告
    B.BANBAN题意:给你一个\(n\),生成一个字符串为BAN重复\(n\)遍。每次操作可以选择两个位置进行交换,问至少多少次交换后可以使该串不存在BAN的子序列。输出方案。......
  • CFR-755-Div-2解题报告
    比赛传送门赛时AC三道,补题做出一道。A.MathematicalAddition{%noteinfono-iconProblem%}给你两个正整数\(u,v\),求一对合法的\(x,y\)使得\(\frac{x}{u}+\fra......
  • CFR-844-Div-1-2解题报告
    比赛传送门A.ParallelProjection题意:有一个\(w\timesd\timesh\)的长方体,顶面和底面有两个点,只能走直线且不能穿过长方体,求最短距离。显然曼哈顿距离必须要走。......
  • CFR-745-Div-2解题报告
    没打比赛,赛后做出3道。这场比赛题目质量很高,非常巧妙。A.CQXYMCountPermutations\(Problem\)求有多少\(2n\)的排列满足存在超过\(n\)个\(i\)使得\(p_i<p_{i+......
  • CFR-746-Div-2解题报告
    VP做出来一道,补题又做出来3道。A.GamerHemose\(Problem\)你有\(n\)个武器,要打一个体力为\(H\)的敌人,第\(i\)个武器可以对敌人造成\(a_i\)的伤害,每把武器不能......