题解 CF766B【Mahmoud and a Triangle】
这道题的排序算法很多大佬都讲得很清楚了,所以这里给出一种奇奇怪怪的做法。
我们指定号为选择的边,然后每次模拟退火,随机交换号中的边和号中的边,通过前三条边中较小的两条边之和与第三边之差更新答案。
如此我们理论上就求得了最大可能的差值,和0比个大小就可以了。
/*
* @Author: Luisvacson
* @LastEditors: Luisvacson
* @Descriptions: None
* @Date: 2021-05-22 20:03:50
* @LastEditTime: 2021-05-22 20:06:23
* @FilePath: \C++\Practice\CF766B Mahmoud and a Triangle.cpp
*/
#include <bits/stdc++.h>
using namespace std;
const double T = 0.996;
#define MAXN 100005
int n, ans;
int a[MAXN];
int Solve() {
sort(a + 1, a + 4);
return a[1] + a[2] - a[3];
}
void SA() {
double tp = 10000;
while (tp > 1e-15) {
int ix = rand() % 3 + 1, iy = rand() % n + 1;
if (ix == iy) continue;
swap(a[ix], a[iy]);
int tans = Solve();
int dif = tans - ans;
if (tans > ans) {
ans = tans;
} else if (!(exp(-dif / tp) * RAND_MAX > rand())) {
swap(a[ix], a[iy]);
}
tp *= T;
}
}
signed main() {
scanf("%lld", &n);
register int i;
for (i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
for (i = 1; i <= 100; ++i) SA();
puts(ans > 0 ? "YES" : "NO");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步