[二分]发年终奖啦

Problem D: 发年终奖啦~

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 226   Solved: 211
[ Submit][ Status][ Web Board]

Description

年末要到了,埃森哲准备给员工发奖金,小Y负责这次的奖金计算,奖金一共要分给25个人,一个人拿一等奖金,两个人拿二等奖金,7个人拿三等奖金,剩下的15个人拿安慰奖金。要求二等奖的奖金是一等奖的80%(小于一元的部分舍去),三等奖金是二等奖金的80%(小于一元的部分舍去),安慰奖金是三等奖金的80%(小于一元的部分舍去)。奖金的总量由老板决定,小Y需要计算出每个等级的奖金数量。二十五个人的奖金分下去后可以有剩余,剩余越少越好,但是不能超支。其实事情挺简单的,但是善变的老板快要把他弄疯了,没一会,老板已经改了十几次奖金总数了,你能帮帮他算一下么。 

Input

 第一行,一个整数n,表示小Y的老板把奖金变动了多少次。

第2~n+1行每行一个整数,表示奖金总量(1~1000000)。

Output

 每个case一行,一等奖的奖金金额。

Sample Input

210100

Sample Output

28

HINT

总奖金的函数y关于一等奖金x单增,用二分解决。

#include <cstring>
#include <string>
#include <cstdio>

inline int getint()
{
    int res=0;char tmp;bool sgn=1;
    do tmp=getchar();
    while (!isdigit(tmp)&&tmp!='-');
    if (tmp=='-'){sgn=0;tmp=getchar();}
    do res=(res<<3)+(res<<1)+tmp-'0';
    while (isdigit(tmp=getchar()));
    return sgn?res:-res;
}

int s;
bool can(int mid)
{
    int a = mid;
    int b = a*0.8;
    int c = b*0.8;
    int d = c*0.8;
    return s>=a+b*2+c*7+d*15;
}

int find()
{
    int l = 0;
    int r = s;
    int rs = 0;
    while (l <= r)
    {
        int mid = ((l+r)>>1);
        if (can(mid))
        {
            l = mid+1;
            if (rs < mid)
                rs = mid;
        }
        else
        {
            r = mid-1;
        }
    }
    return rs;
}

int main()
{
    int n;
    scanf("%d",&n);

    bool first = true;
    for (int i=1;i<=n;i++)
    {
        if (!first)
            printf("\n");
        first = false;
        s = getint();
        printf("%d",find());
    }

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值