总觉得模拟题其实没有什么思路好写,
就收藏一下自己觉得好的题吧
#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\n",pre); return 0; }