第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)
题目源地址:https://ac.nowcoder.com/acm/contest/10272
蒟蒻的龟速 补题
A
B
C
D
E
F
从题意中得出(n*𝑥+m)/(1−(1-p)^𝑥 )为时间期望函数,且能得出在x为正值时函数为凹函数,所以用三分法来求函数最小值
#include <bits/stdc++.h>
#pragma GCC optimize (2)
#pragma G++ optimize (2)
using namespace std;
typedef long long ll;
#define endl "\n"
double QPow(double a, ll b)
{
double ans = 1;
while (b)
{
if (b & 1) ans *= a;
a *= a;
b >>= 1;
}
return ans;
}
double f(ll x, double n, double m, double pp)
{
return (1.0 * x * n + m) / (1.0 - QPow(pp, x));
}
int main()
{
int t = 0;
double n = 0, m = 0, p = 0;
cin >> t;
while (t--)
{
cin >> n >> m >> p;
double pp = 1.0 - p / 1e4;
ll l = 0, r = 1e18;
double lans = 0.0, rans = 0.0;
while (l < r)
{
ll lmid = l + (r - l) / 3;
ll rmid = r - (r - l) / 3;
lans = f(lmid, n, m, pp);
rans = f(rmid, n, m, pp);
if (lans <= rans)
r = rmid - 1;
else
l = lmid + 1;
}
cout << setiosflags(ios::fixed) << setprecision(10) << fmin(lans, rans) << endl;
}
system("pause");
return 0;
}
G
H
I
J
K
由gcd(n,n+1)=1,可知在需要存在k个互素的的排列时,只需要把1以后的前面k-1个数向后移一位,在第k位补上1就简单的构造好了。
#include <bits/stdc++.h>
#pragma GCC optimize (2)
#pragma G++ optimize (2)
using namespace std;
#define endl "\n"
typedef long long ll;
static const ll MAXN = 1e6 + 10;
int main()
{
int n = 0, k = 0;
cin >> n >> k;
if (k == 0)
cout << -1;
else
{
for (int i = 1; i < k; i++)
cout << i + 1 << ' ';
cout << 1 << ' ';
for (int i = k + 1; i <= n; i++)
{
if (i != n)
cout << i << ' ';
else
cout << i << endl;
}
}
return 0;
}