• COGS 2057. [ZLXOI2015]殉国


    ★☆   输入文件:BlackHawk.in   输出文件:BlackHawk.out   评测插件
    时间限制:0.05 s   内存限制:256 MB

    【题目描述】


    正义的萌军瞄准了位于南极洲的心灵控制器,为此我们打算用空袭摧毁心灵控制器,然而心灵控制器是如此强大,甚至能缓慢控制飞行员。一群勇敢的士(feng)兵(zi)决定投弹后自杀来避免心灵控制。然而自杀非常痛苦,所以萌军指挥官决定到达目的地后让飞机没油而坠落(也避免逃兵)。军官提供两种油:石油和中国输送来的地沟油,刚开始飞机没有油,飞机可以加几桶石油和几桶地沟油(假设石油和地沟油都有无限桶),飞机落地时必须把油耗尽,已知一桶石油和一桶地沟油所能支撑的飞行距离分别为a,b,驾驶员们必须飞往一个目的地,总距离为c.

    1.最少,最多需要加几桶油,若只有一种方案,最少和最多的是相同的.

    2.总共有多少种不同的加油配方(死法)能到达目的地。

    【输入格式】

    只有一行,三个正整数a,b,c

    【输出格式】

    两行,第一行为最少加几次油和最多加几次油,

    第二行为加油方法总数。

    若不存在任何方法,第一行输出-1 -1

    第二行输出0

    【样例输入】

    样例1:
    2 3 10
    样例2:
    6 8 10
    

    【样例输出】

    样例1:
    4 5
    2
    样例2:
    -1 -1
    0
    

    【提示】

    样例解释:

    样例一:飞机加两次石油,两次地沟油,总次数为4,2*2+3*3=10

    飞机加五次石油,不加地沟油,总次数为5,2*5+3*0=10

    总共两种

    样例二:飞机无法到达目的地

    数据范围:

    对于10%的数据,a<=103,b<=103,c<=103

    对于20%的数据,a<=104,b<=104,c<=106

    对于50%的数据,a<=109b<=109,c<=109

    对于100%数据,a<=31018b<=31018,c<=31018

    三个答案分值权重分别为20%,30%,50%

    【来源】

    这道题卡了很长时间 

    就是求ax+by=c x+y的最大值与最小值和不同的解的个数 

    很明显的扩展欧几里得
    令gcd(A,B)=D;
    Ax+By=C满足有解的必要条件是C mod D = 0
    我们先解方程Ax+By=gcd(A,B),得到该方程一组解(p',q’)乘以C/D
    即为原方程的一组解(p0,q0)
    则任何(p,q)满足
    p = p0 +B/D *t
    q = q0–A/D *t(其中t为任意整数)都为原方程的解
     
    因为p>=0&&q>=0
    所以解不等式求t的范围 (没想到移向卡了4小时。。。)
    注意上下取整 数据在long long 范围内 所以需要long double
    然后最大值与最小值都在区间开头和结尾取得
    方案数等于区间大小 。
    因为 p,q满足单调性,但单增单减无法确定 
    所以最后输出取max与min。
    #include <iostream>
    #include <ctype.h>
    #include <cstdio>
    #include <cmath>
    typedef long long LL;
    using namespace std;
    void read(LL &x)
    {
        x=0;bool f=0;
        register char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
        for(; isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
        x=f?(~x)+1:x;
    }
    LL exgcd(LL a,LL b,long long &x,long long &y)
    {
        if(b==0)
        {
            x=1;
            y=0;
            return a;
        }
        LL an=exgcd(b,a%b,x,y);
        long long tmp=x;
        x=y;
        y=tmp-a/b*y;
        return an;
        
    }
    void swap(LL &m,LL &n)
    {
        LL tmp=n;
        n=m;
        m=tmp;
    }
    LL max(LL a,LL b) {return a>b?a:b;}
    LL min(LL a,LL b) {return a>b?b:a;}
    LL a,b,c,ans,Max,Min;
    bool linear_equation(LL a,LL b,LL c)
    {
        LL x,y;
        LL gcd=exgcd(a,b,x,y);
        if(c%gcd) return false;
        LL x0=c/gcd*x,y0=c/gcd*y;
        LL l=ceil((long double)-x0/b*gcd),r=floor((long double)y0/a*gcd);
        ans=r-l+1;
        Max=x0+b/gcd*r+y0-a/gcd*r;
        Min=x0+b/gcd*l+y0-a/gcd*l;
        return true;
    }
    int main()
    {
        freopen("BlackHawk.in","r",stdin);
        freopen("BlackHawk.out","w",stdout);
        read(a);read(b);read(c);
        if(!(linear_equation(a,b,c))) printf("-1 -1
    0");
        else if(ans) cout<<min(Min,Max)<<" "<<max(Min,Max)<<endl<<ans;
        else printf("-1 -1
    0");
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    Iphone [Tab Bar实现多view切换,Picker,DataPicter实现
    基于socket、多线程的客户端服务器端聊天程序
    C/C++面试题
    Unity3D打Box游戏
    Unity3D项目开发一点经验
    Unity3D使用过程中常见的20个问题
    @property中strong跟weak的区别
    java多线程系列8 高级同步工具(2)CountDownLatch
    java多线程系列7 高级同步工具(1)信号量Semaphore
    java多线程系列6 synchronized 加强版 ReentrantLock
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7323713.html
Copyright © 2020-2023  润新知