zoukankan      html  css  js  c++  java
  • D

    Gym - 100883H

    一共有(N)个人要乘船出行。
    你有两条船,每次载人出去一次花费(c_1,c_2),载人量为(n_1,n_2)
    船必须载满才能出行,求运送所有人的最小花费。

    首先利用裴蜀定理和扩展欧几里得求出一组解。
    (n_1x + n_2y = gcd(n_1,n_2) = g)

    然后判断(N Mod g)是否为0,不为0无解。

    然后(x*=N/g,y*=N/g),使得(n_1x +n_2y=N)

    然后考虑(x = x + kn_2, y = y - kn_1),上面的式子仍然满足

    判断(c_1 * n_2)(c_2 *n_1)的大小关系即可。

    
    #include<bits/stdc++.h>
    using namespace std;
    
    long long N,n1,n2,c1,c2;
    
    long long exgcd(long long a,long long b,long long &x,long long &y){
        if(!b){
            long long ret = a; x = 1; y = 0; return ret;
        }
        long long ret = exgcd(b,a % b,y,x);
        y -= a/b * x;
        return ret;
    }
    
    int main(){
        while(1){
            scanf("%lld",&N);
            if(N == 0) break;
            
            scanf("%lld%lld%lld%lld",&c1,&n1,&c2,&n2);
            
            long long x = 0, y = 0;
            long long g = exgcd(n1,n2,x,y);
            if(N % g != 0) { puts("failed"); continue; }
            
            x *= N/g; y *= N/g;
            if(n1 * c2 < n2 * c1){
                x = (x % n2 + n2) % n2;
                y = (N - n1 * x) / n2; 
            }else{
                y = (y % n1 + n1) % n1;
                x = (N - n2 * y) / n1;
            }
            printf("%lld %lld
    ",x,y);
        }
        return 0;
    }
    
    
  • 相关阅读:
    文件拖拽上传
    30天自制操作系统笔记(第三天)
    PAT 1040到底有几个pat
    pat 1039 到底买不买
    pat 1038 统计同成绩学生
    pat 乙级1034
    pat 乙级1022
    pat 乙级1009
    pat 乙级1008
    pat 乙级1002
  • 原文地址:https://www.cnblogs.com/zzhzzh123/p/13374134.html
Copyright © 2011-2022 走看看