jzyzoj题目选做

1025

P1815

一道贪心,喵?

好吧其实就是个贪心,最大值比较简单,最小值不太好搞看看代码自己理解

#include <bits/stdc++.h>
#define LL long long
using namespace std;


inline int read()
{
    register int x = 0;
    register char ch = getchar();
    while( ch < '0' || ch > '9' ) ch = getchar();
    while( ch >= '0' && ch <= '9' )
    {
        x = ( x << 3 ) + ( x << 1 ) + ch - '0';
        ch = getchar();
    }
    return x;
}

int main()
{
    LL n , x , y , k , xx , yy , w;
    LL ans ;
    while( scanf( "%lld" , & x ) == 1 )
    {
        xx = x , y = yy = read() , n = read();
        //特判
        if( n == 1 )
        {
            if( x > y ) puts("3 3");
            else if( x == y ) puts("1 1");
            else puts("0 0");
            continue;
        }
        //max
        w = n - 1;
        k = min( n - 1 , x ) , x -= k , w -= k , ans = k * 3 ;
        if( x > y ) ans += 3;
        else if( x == y ) ans += 1;
        ans += w;
        printf("%lld " , ans );
        //min
        if( xx > yy )
        {

            n -- , ans = 3 ; //把所有的 x 都放到一个格子里,保证只赢一次
            k = min( yy , n ) , ans += n - k; //再给剩下的格子尽可能的放 y
            printf( "%lld\n" , ans );
            continue;
        }

        if( xx == yy )
        {
            if( n >= 3 && yy >= 3 )
            {
                // 同 xx > yy
                n -- , ans = 3 ;
                k = min( yy , n ) , ans += n - k;
                printf( "%lld\n" , ans );
            }
            else printf( "%lld\n" , n ); //直接全部平局
            continue;
        }

        // 对于xx<yy的情况
        n -- ;
        ans = 3 + n - ( min( n , yy ) ); // 把所有的 x 放在一个格子里,剩下的格子每个放一个 y
        yy -= xx;
        ans = min( ans , 1 + n - min( n , yy ) ); // 在一个格子里抵消掉所有的 x 后面的全部放 y
        yy --;
        ans = min( ans , n - min( n , yy ) ); // 在保证不会赢的情况下,尽可能的放 y
        printf( "%lld\n" , ans );
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Mark-X/p/11739887.html