zoukankan      html  css  js  c++  java
  • COGS——T 2057. [ZLXOI2015]殉国

    http://cogs.pro/cogs/problem/problem.php?pid=2057

    ★☆   输入文件: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%

    【来源】

    exgcd求出 x0,y0

    则 x=x0+kbb,y=y0-kaa 由题意得 x>=0 y>=0

    求出k的范围     从而得出方案数

    因为是线性方程  所以在 定义域的边界得到最值

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cmath>
     5 
     6 using namespace std;
     7 
     8 #define LL long long
     9 LL a,b,c,x,y;
    10 LL ans_num;
    11 
    12 LL exgcd(LL a,LL b,LL &x,LL &y)
    13 {
    14     if(b==0)
    15     {
    16         x=1; y=0;
    17         return a;
    18     }
    19     LL ret=exgcd(b,a%b,x,y);
    20     LL tmp=x;
    21     x=y;
    22     y=tmp-(a/b)*y;
    23     return ret;
    24 }
    25 
    26 int main()
    27 {
    28     freopen("BlackHawk.in","r",stdin);
    29     freopen("BlackHawk.out","w",stdout);
    30     
    31     scanf("%lld%lld%lld",&a,&b,&c);
    32     LL gcd=exgcd(a,b,x,y);
    33     if(c%gcd!=0)
    34     {
    35         printf("-1 -1
    0");
    36         return 0;
    37     }
    38     LL L=ceil((long double)-x/b*c);
    39     LL R=floor((long double)y/a*c);
    40     x*=(c/gcd); y*=(c/gcd);
    41     LL aa=a/gcd,bb=b/gcd;
    42     ans_num=R-L+1;
    43     LL an1=x+y+(bb-aa)*L;
    44     LL an2=x+y+(bb-aa)*R;
    45     if(ans_num<=0) printf("-1 -1
    0");
    46     else
    47     {
    48         printf("%lld ",min(an1,an2));
    49         printf("%lld
    ",max(an1,an2));
    50         printf("%lld",ans_num);
    51     }
    52     return 0;
    53 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    ABAP 表格控制(Table Control)和步循环
    ABAP中正则表达式的简单使用方法 (转老白BLOG)
    ABAP常用函数集锦
    ALV用例大全
    DXP 笔记
    STM32笔记——Power Controller(PWR)
    STM32之glossary
    STM32 解析futaba S-bus协议
    Windows下 vundle的安装和使用
    使用串口绘制实时曲线 —— SerialChart
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7324020.html
Copyright © 2011-2022 走看看