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;
}
原文地址:https://www.cnblogs.com/Mark-X/p/11739887.html
时间: 2024-10-17 16:05:52