Problem D: 发年终奖啦~
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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;
}