http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1603
题意:N门课,每门课不复习能得到S分,这门课在T时间考试,第一次复习能增加A分,每多一次复习收益减少D,问最后能不能全科及格,全科及格最大的分数时多少
思路:贪心,首先我们要先使得全科及格,然后在这个基础上,不断的累加能够增加分数最多的情况
<pre name="code" class="cpp">#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
#define ls 2*i
#define rs 2*i+1
#define up(i,x,y) for(i=x;i<=y;i++)
#define down(i,x,y) for(i=x;i>=y;i--)
#define mem(a,x) memset(a,x,sizeof(a))
#define w(a) while(a)
#define LL long long
const double pi = acos(-1.0);
#define Len 200005
#define mod 19999997
const int INF = 0x3f3f3f3f;
#define exp 1e-8
struct node
{
int s,t,a,d;
friend bool operator<(node a,node b)
{
return a.a<b.a;
}
int check()
{
if(100-s>a) return a;
else return 100-s;
}
} stu[55];
int n,hsh[750];
int main()
{
int i,j,k,flag;
w((~scanf("%d",&n)))
{
mem(hsh,1);
flag = 1;
up(i,0,n-1)
{
scanf("%d%d%d%d",&stu[i].s,&stu[i].t,&stu[i].a,&stu[i].d);
int tem = stu[i].t;
w((tem>0&&stu[i].s<60&&stu[i].a>0))
{
if(hsh[tem])
{
stu[i].s+=stu[i].check();
stu[i].a-=stu[i].d;
hsh[tem]=0;
}
tem--;
}
}
down(i,720,1)
{
if(hsh[i])
{
k = -1;
up(j,0,n-1)
{
if(stu[j].t>=i && (k==-1||stu[j].check()>stu[k].check()))
k = j;
}
if(k!=-1 && stu[k].a>0)
{
stu[k].s+=stu[k].check();
stu[k].a-=stu[k].d;
}
}
}
int ans = 0;
up(i,0,n-1)
{
if(stu[i].s>=60)
ans+=stu[i].s;
else
{
flag = 0;
break;
}
}
if(flag) printf("%d\n",ans);
else printf("you are unlucky\n");
}
return 0;
}