【刷题】【模拟】复制cs

总觉得模拟题其实没有什么思路好写,

就收藏一下自己觉得好的题吧

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define dd double
using namespace std;
int n,k,m;
const int N=1003;

int cnt;
struct node
{
    dd l,r;
    bool operator < (const node & o ) const
    { return l<o.l; }
}d[N],g[N];

int main()
{
    //input
    scanf("%d%d%d",&n,&k,&m);
    for(int i=1;i<=m;i++)
        scanf("%lf%lf",&d[i].l ,&d[i].r ),d[i].r +=d[i].l ;
    sort(d+1,d+m+1);
    //prepare(找出不重叠区间) 
    dd ll=d[1].l ,rr=d[1].r ;
    for(int i=2;i<=m;i++)
        if(d[i].l <=rr )
            rr=max(rr,d[i].r );
        else
        {
            g[++cnt].l =ll,g[cnt].r =rr;
            ll=d[i].l ,rr=d[i].r ;
        }
    g[++cnt].l =ll,g[cnt].r =rr;
    //work
    bool ok=false;
    dd pre=0;
    int res=n-1,b=1; //b表示这一轮能够传染多少人 
    for(int i=1;i<=cnt ;i++)
    {
        while(pre+1 <= g[i].l && !ok )
        {
            res-=b,pre++;
            if(res<=0)
                ok=true;
            else
                b=min(k,b<<1); 
        }
        if(ok)
            break;
        pre=g[i].r ;
    }
    while(res>0)
    {
        pre++,res-=b;
        b=min(k,b<<1);
    }
    //output
    printf("%.2lf
",pre);
    return 0;
}
原文地址:https://www.cnblogs.com/xwww666666/p/11781145.html