【FJSC2012】足球

时间:2019-10-17
本文章向大家介绍【FJSC2012】足球,主要包括【FJSC2012】足球使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
我们当中有很多热爱中国足球的同学,我们都知道中超(中国足球超级联赛)的规则:
一场比赛中,若获胜则获得3的积分,若打平则获得1分,若失败获得0积分。
这个问题很简单,假设N轮比赛中你一共攻入S个球,丢掉T个球,那么你可能获得的最大得分和最小得分是多少

刷数论题的时候刷到这个了……

这真的能叫数论题吗?不就是个裸的贪心

考虑把最大得分和最小得分分开讨论:

最大得分

  1. 进球数还没有总场次多

显然应该把所有的进球平摊到每一场使自己胜场尽量多

即让所有丢球集中到同一天

答案=进球数3+(剩下的场数-1)1

需要注意一点,如果没有丢球,答案需要加一,因为不会存在负场

  1. 进球数多于胜场

考虑两种方案:

一种是把丢球全部安排到同一天

另一种是进球数可以做到全胜,那就全胜

同样的,如果最后一局不会负,那就平局,加一分

最小得分

  1. 如果进球数已经多余了丢球数

因为至少都肯定会赢一局,所以干脆把所有进球集中到这一天,看有多少平局

否则,我们就比较一下赢了一局,剩下的全输或平局,以及全是平局的分数那个更低就好了

代码:

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

ll s,t,n;

int main()
{
    while(scanf("%lld%lld%lld",&s,&t,&n)!=EOF)
    {
        ll ans1=0,ans2=0;
        
        if(s<n)
        {
            ans1=3*s+n-s-1;
            if(!t) ans1++;
        }
        else
        {
            ans1=3*max(n-1,min(n,s-t));
            if(n-s+t==1) ans1++;
        }

        if(s>t) ans2=3+max(0LL,n-t-1);
        else ans2=min(3+max(0LL,n-t-1),max(n-t+s,0LL));
        
        printf("%lld %lld\n",ans1,ans2);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/tqr06/p/11690303.html