TOYOTA SYSTEMS Programming Contest 2022(AtCoder Beginner Contest 279) - AtCoder
D - Freefall
题意:给定a,b. 求函数 的最小值。
思路:易知函数f是一个单峰有极小值的函数,三分求出极小值点带入函数求值即可
三分法:在区间内用两个mid将区间分成三份,这样的查找算法称为三分查找,也就是三分法,三分法常用于求解单峰函数的最值。
#include<bits/stdc++.h>
#define int long long
#define PII pair<int,int>
#define ios ios::sync_with_wtdio(false);cin.tie(0);cin.tie(0)
using namespace std;
const double inf=1e18+10;
const int eps=1e-6;
double a,b;
double f(double x){
return a/sqrt(1+x)+x*b;
}
void solve(){
cin >> a >> b;
int l=0,r=inf;
int midl,midr;
while(l<r){
int midl=l+(r-l)/3;
int midr=r-(r-l)/3;
if(f(midl)<f(midr)) r=midr-1;
else l=midl+1;
}
int ans;
if(f(l)<f(r)) ans=l;
else ans=r;
printf("%.10lf",f(ans));
}
signed main(){
int t=1;
// cin >> t;
while(t--){
solve();
}
return 0;
}
E - Cheating Amidakuji
题意:给定n,m和长度为m的数组a 。
数组b为长度为n 且
定义操作进行m次,每次交换
要求输出如果不进行第k次操作(1<=k<=m),b数组中1的位置在哪里
思路:由题意知每次在b中的交换都是相邻项交换,假设第j次交换x ,y的位置:
..............x y............... ,如果不进行第j次交换,对于j次之前的操作没有影响,对与j次及之后的交换 x的最终位置就是y的位置,y的位置就是x的位置。
所以可以一开始就将m次操作全部进行完,记录b中每个数最终的位置,然后枚举不进行第k(1<=k<=m)次操作最终1的位置,如果在不进行的第j次操作中, 中如果都不是1,
则此次交换对最终1的位置没有影响,输出pos[1]即可,否则就是存在1,那么因为没有进行这次操作,最终1 的位置就是不是 1 的那一个数的最终位置。
#include<bits/stdc++.h>
#define int long long
#define PII pair<int,int>
#define ios ios::sync_with_wtdio(false);cin.tie(0);cin.tie(0)
using namespace std;
const int N=2e5+10;
int a[N],b[N];
int n,m;
int pos[N];
void solve(){
cin >> n >> m;
for(int i=1;i<=m;i++) cin >> a[i];
for(int i=1;i<=n;i++) b[i]=i;
for(int i=1;i<=m;i++) swap(b[a[i]],b[a[i]+1]);
for(int i=1;i<=n;i++) pos[b[i]]=i;
for(int i=1;i<=n;i++) b[i]=i;
for(int i=1;i<=m;i++){
if(b[a[i]]==1) cout << pos[b[a[i]+1]] << endl;
else if(b[a[i]+1]==1) cout << pos[b[a[i]]] << endl;
else cout << pos[1] << endl;
swap(b[a[i]],b[a[i]+1]);
}
}
signed main(){
int t=1;
// cin >> t;
while(t--){
solve();
}
return 0;
}
F - BOX(并查集 / 启发式合并) 待补