美文网首页
2017.9.19 noip模拟 二分法 哈密顿回路 数学(二项

2017.9.19 noip模拟 二分法 哈密顿回路 数学(二项

作者: 噩噩噩噩噩v | 来源:发表于2017-09-19 20:31 被阅读0次

    T1 简单的二分法

    有一个果园,有 n 棵果树依次排成一排,其中已知第 i 棵果树上结了 a 个果子。现在要按照果树编号顺序依次收果
    子,对于一个能装 v 个果树的果篮,收果子从第 1 棵果树开始,如果果篮的剩余容积大于等于当前果树所结的果子,那么就可以将此树上的果子全收下来,否则就要拿一个新的篮子来装果子。特别地,如果果篮容积小于某果树的结果数,那么我们认为这样将永远不能收完果子。
    现在假若只能用 k 个果篮,问按照以上方法能使用不超过 k 个果篮并收完所有果子的果篮最小容积。
    输入格式:
    从文件 fruit.in 输入数据。
    输入有两行,第一行两个正整数,代表 n、k,意义如题。
    第二行 n 个正整数ai ,代表每棵果树的结果数。
    输出格式:
    输出到文件 fruit.out 中。

    输出仅一行,一个正整数,即满足条件的果篮最小容积。
    样例 1:
    输入
    9 3
    1 2 3 4 5 6 7 8 9
    输出
    17
    限制与约定:
    对于 30% 的数据,满足 n, k ⩽ 100、ai⩽ 100。
    对于 60% 的数据,满足 n, k ⩽ 1000、ai⩽ 105。
    对于 80% 的数据,满足 n, k ⩽ 10000、ai ⩽ 105。
    对于 100% 的数据,满足 n, k ⩽ 105、ai ⩽ 109。

    一个显然的二分法,大佬们肯定都会

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=1e5+5;
    ll n,k,l=1,r,ans,s;
    ll a[N]; 
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    bool check(ll v)
    {
        ll sum=0,now=0;
        for(ll i=1;i<=n;i++)
        {
            if(now+a[i]<=v) now+=a[i];
            else if(a[i]>v||sum==k-1) return 0;
            else sum++,now=a[i];
        } 
        return 1;
    } 
    int main()
    {
        freopen("in.txt","r",stdin);
        n=read();k=read();
        for(ll i=1;i<=n;i++) a[i]=read(),s+=a[i];
        r=s;
        while(l<r)
        {
            ll mid=(l+r)>>1; 
            if(check(mid)) ans=r=mid;
            else l=mid+1;
        }
        cout<<ans<<endl; 
    }
    
    

    T2 哈密顿回路

    题目描述:长者国马上要举行一次盛大的马拉松赛跑了!全国各地的记者在首都欢聚一堂,参加这一意义重大的比赛。有一位长者在首都画了一个圈,作为比赛的赛道。同时,为了增加趣味性,这条赛道还添加了一些“捷径”。当然,这些捷径并不意味着具体来讲,赛道上一共有 n 个地点,编号为 1..n。某些地点之间可能存在相连的跑道。记者们将在 1 号地点起跑,经过每个地点一次之后回到 1 号地点。例如,在下面的赛道中:

    20170919102351_82882[1].jpg

    路径 1 − 2 − 3 − 4 − 1 是允许的,而 1 − 2 − 4 − 1 和 1 − 2 − 3 − 4 − 2 − 1 是不允许的。
    作为来自全世界记者跑的最快的地区的你,早已经打听到赛道的具体情况。于是你想知道这一次赛跑你最少要花多少时间。
    输入格式:
    从文件 run.in 输入数据。
    第一行输入两个正整数 n 和 m,表示地点的数量和跑道的数量。
    接下来 m 行,每行三个正整数 u、v 和 t,表示 u 号地点和 v 号地点之间的一条跑道,并且通过这条跑道你需要花费 t分钟。我们认为经过每个地点是不需要花费时间的。

    输出格式:
    输出到文件 run.out 中。
    输出一行一个整数,表示最少需要多少分钟,你才可以完成赛跑。
    样例 1
    输入
    4 5
    1 2 1
    2 3 1
    3 4 1
    4 1 1
    2 4 1
    输出
    4
    样例2:

    输入
    15 19
    4 11 3
    2 3 3
    3 12 5
    12 15 1
    3 4 9
    4 15 8
    2 6 4
    6 14 8
    9 13 7
    2 13 8
    1 10 1
    7 10 6
    6 8 10
    5 7 9
    8 11 3
    12 14 10
    1 15 2
    3 9 7
    5 14 8
    输出
    91
    限制与约定
    对于 100% 的数据,满足 n ⩽ 105,n ⩽ m ⩽ n + 20,1 ⩽ u, v ⩽ n,1 ⩽ t ⩽ 100。并且数据保证你可以找到一组合法的
    方案。
    对于每个测试点限制如下:


    20170919102824_86125[1].jpg

    T3 二项式定理

    20170919103319_29274[1].jpg

    输入格式
    从文件 problem.in 输入数据。
    输入一共一行三个正整数 n、s 和 d,这些参数的意义均在上文给出。
    输出格式
    输出到文件 problem.out 中。
    输出共一行一个整型,表示答案对 998244353 取模后的值。
    样例 1
    输入
    9999999 1 0
    输出
    951935696
    解释
    机智的鸥蛤菌发现这个数字就是 29999999mod 998244353。
    样例 2
    输入
    9999999 1000000000000000000 899999999999777777
    输出
    348456814
    限制与约定
    对于 100% 的数据,满足 n, s, d ⩽ 1018。
    对于每个测试点的限制如下:

    20170919103604_40689[1].jpg

    显然的二项式定理
    所以很简单,

    相关文章

      网友评论

          本文标题:2017.9.19 noip模拟 二分法 哈密顿回路 数学(二项

          本文链接:https://www.haomeiwen.com/subject/hdugsxtx.html