题解 CF766B【Mahmoud and a Triangle】
这道题的排序算法很多大佬都讲得很清楚了,所以这里给出一种奇奇怪怪的做法。
我们指定\(1-3\)号为选择的边,然后每次模拟退火,随机交换\(1-3\)号中的边和\(4-n\)号中的边,通过前三条边中较小的两条边之和与第三边之差更新答案。
如此我们理论上就求得了最大可能的差值,和0比个大小就可以了。
\(Code:\)
/*
* @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;
}

浙公网安备 33010602011771号