1 条题解
-
0
C :
#include<stdio.h> #include<math.h> int main(int argc,char *argv[]) { int n; float p;/*n?????,p??????*/ while(scanf("%d%f",&n,&p),n,p) { float time=0;/*???????*/ float p1,p2,t1,t2,w1=0,w2=0,W1=0,W2=0;/*w1?“?1?”,w2?“?2?”,W?????*/ while(n--) { W1=W1+w1; W2=W2+w2; if(w2==0) p=p+W1,W1=0; if(w1!=0) p=p*pow(2,W2),W2=0; scanf("%f%f%f%f%f%f",&p1,&p2,&t1,&t2,&w1,&w2); if(p<p1) printf("Impossible "); else if(p>=p2) time=t2; else if(p<p2&&p>=p1) { float k=(p2-p1)/(t2-t1);/*???????*/ float b=p2-k*t2; time+=(p-b)/k; } } if(time!=0) printf("%.2f",time); if(n) printf("\n"); } return 0; }
C++ :
#include<cstdio> #include <iostream> #include <cstring> #include<queue> /* 得到加药得到就吃, 这个*2的药就有讲究了可能需要在后面累加到一定值*2 每次比赛前三种情况 对于>p2的 直接加t2过 /<p1的肯定要加多少 就有很多种情况了 直到加到>p2就停止了就OK了 [p1,p2]里一样 每次计算w2的药数量,只要有+药,每次必须吃加药,然后分别对 t2时间和线性时间处理,记录一个k作为步数,为n时动作完成 */ using namespace std; struct node { double p1,p2,t1,t2,w1,w2; } plants[1010]; struct bode { int p; int k; double t; int w1,w2; } ft,et; int m,n; double MAX; void bfs() { queue<bode>Q; ft.p=m; ft.k=0; ft.t=0; ft.w1=0,ft.w2=0; Q.push(ft); while(!Q.empty()) { ft=Q.front(); Q.pop(); if(ft.k==n) { if(MAX>ft.t) MAX=ft.t; continue; } if(ft.p>plants[ft.k+1].p2)//比最大的power还大,用+药 { ft.p+=plants[ft.k+1].w1; ft.w2+=plants[ft.k+1].w2; ft.t+=plants[ft.k+1].t2; ft.k+=1; Q.push(ft); } else if(ft.p<plants[ft.k+1].p1) { et=ft; int j=ft.w2; for(int i=1; i<=j; i++)//尝试,看看要用几瓶*2药---------- {// | ft.p*=2; // | if(ft.p<plants[ft.k+1].p1) // | continue; // | if(ft.p>plants[ft.k+1].p2) // | { // k退回,继续尝试,直到执行continue。 ft.t=et.t+plants[ft.k+1].t2; // | ft.w2=et.w2+plants[ft.k+1].w2-i;//剩下的w2药 // | ft.p+=plants[ft.k+1].w1;//吃w1 // | ft.k++; // | Q.push(ft); // | ft.k--;//----------------------------------------- ft.p-=plants[ft.k+1].w1; break; } else { ft.w2=et.w2+plants[ft.k+1].w2-i; double T1=plants[ft.k+1].t1; double T2=plants[ft.k+1].t2; double P1=plants[ft.k+1].p1; double P2=plants[ft.k+1].p2; double pp=(T1-T2)*1.0/(P2-P1); ft.t=et.t+(T1-pp*(ft.p-P1)*1.0); ft.p+=plants[ft.k+1].w1; ft.k++; Q.push(ft); ft.k--; ft.p-=plants[ft.k+1].w1; } } } else { et=ft; int j=ft.w2; for(int i=0; i<=j; i++)//>=plants[ft.k+1].p1多了=情况 { if(i==0) ft.p*=1; else ft.p*=2; if(ft.p<plants[ft.k+1].p1) continue; if(ft.p>plants[ft.k+1].p2) { ft.t=et.t+plants[ft.k+1].t2; ft.w2=et.w2+plants[ft.k+1].w2-i; ft.p+=plants[ft.k+1].w1; ft.k++; Q.push(ft); ft.k--; ft.p-=plants[ft.k+1].w1; break; } else { ft.w2=et.w2+plants[ft.k+1].w2-i; double T1=plants[ft.k+1].t1; double T2=plants[ft.k+1].t2; double P1=plants[ft.k+1].p1; double P2=plants[ft.k+1].p2; double pp=(T1-T2)*1.0/(P2-P1); ft.t=et.t+(T1-pp*(ft.p-P1)*1.0); ft.p+=plants[ft.k+1].w1; ft.k++; Q.push(ft); ft.k--; ft.p-=plants[ft.k+1].w1; } } } } } int main() { int i; while(~scanf("%d%d",&n,&m),n+m) { for(i=1; i<=n; i++) { scanf("%lf%lf%lf",&plants[i].p1,&plants[i].p2,&plants[i].t1); scanf("%lf%lf%lf",&plants[i].t2,&plants[i].w1,&plants[i].w2); } MAX=1999999999; bfs(); if(MAX==1999999999) printf("Impossible\n"); else printf("%.2lf\n",MAX); } return 0; }
- 1
信息
- ID
- 696
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者