第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)

发布时间:2022-07-01 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

F.Fireworks

思路:

由于是最优策略,所以并不是单纯的求期望,而再分析下题目,说做一个烟花是n分钟,放所有烟花是m分钟,那对于最优策略我们可以求一个k,表示每制作k个烟花放一次,那么每一轮时间花费就是k * n + m,由于成功的概率是p,所以失败的概率是(1 - p),因此至少有一个成功的烟花的概率就是(1 - (1 - p) ^ k),显然这是一个几何分布,所以期望就为1 / (1 - (1 - p) ^ k),表示进行了多少轮,再乘以每一轮的时间花费就是

(k * n + m) / (1 - (1 - p) ^ k)

求二阶导可知这是一个单峰函数,所以可以三分出答案

然后就是要注意开long double,输出long double 的时候是%Lf

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <map>
#include <unordered_set>
#include <unordered_map>

#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(0);

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 200010;
const double PI = acos(-1);

int n, m;
long double p;

long double f(int k)//(k*n+m) / (1-(1-p)^k)
{
    return 1.0 * (k * n + m) / (1 - pow(1 - p, k));
}

int main()
{
    IOS;
    int T = 1;
    cin >> T;
    while(T -- )
    {
        cin >> n >> m >> p;
        p *= 1e-4;
        int l = 1, r = 0x3f3f3f3f;
        while(l < r)
        {
            int mid = l + (r - l) / 3, midmid = r - (r - l) / 3;
            if(f(mid) < f(midmid))
                r = midmid - 1;
            else
                l = mid + 1;
        }

        printf("%.10Lfn", f(l));
    }
    return 0;
}

L.Let's Play Curling

思路:

题目中说找到一个c很具有迷惑性,其实具体思路就是在两个b之间找到最多数量的a,我们可以用lower_bound来做,因此我们可以先排序,然后找出所有连续的两个b之间的a的数量,但需要注意的是,我们还需要考虑第一个b之前是否有一些a和最后一个b之后是否有一些a,因此我们可以先在原b数组增加两个数,一个最小值一个最大值然后再找

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <map>
#include <unordered_set>
#include <unordered_map>

#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(0);

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 100010;
const double PI = acos(-1);

int a[N], b[N];

int main()
{
    IOS;
    int T = 1;
    cin >> T;
    while(T -- )
    {
        int n, m;
        cin >> n >> m;
        for (int i = 1; i <= n; i ++ )
            cin >> a[i];
        for (int i = 1; i <= m; i ++ )
            cin >> b[i];
            
        b[++m] = 0, b[++m] = 0x3f3f3f3f;
        sort(a + 1, a + 1 + n);
        sort(b + 1, b + 1 + m);

        int res = 0;
        for (int i = 1; i <= m; i ++ )
        {
            int l = lower_bound(a + 1, a + 1 + n, b[i] + 1) - a;//下标
            int r = lower_bound(a + 1, a + 1 + n, b[i + 1]) - a;//下标
            res = max(res, r - l);
        }

        if(res > 0)
            cout << res << endl;
        else
            cout << "Impossible" << endl;
    }
    return 0;
}

 

脚本宝典总结

以上是脚本宝典为你收集整理的第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)全部内容,希望文章能够帮你解决第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: