1 条题解

  • 0
    @ 2025-4-12 21:33:54

    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
    上传者