比赛 |
20101117 |
评测结果 |
WEEEEEEEEW |
题目名称 |
物品 |
最终得分 |
0 |
用户昵称 |
Citron酱 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2010-11-17 09:50:45 |
显示代码纯文本
#include <fstream>
#include <string>
#define I_F "magica.in"
#define O_F "magica.out"
#define MAX 1000
using namespace std;
int p[MAX][2];
int n,m;
long ans;
void Input();
void Sell1();
int max(int a, int b);
void Dyna();
void Sell2();
void Output();
int main()
{
Input();
Sell1();
if (ans<m)
Dyna();
Sell2();
Output();
}
void Input()
{
ifstream fin(I_F);
fin>>n>>m;
string ts;
int i,j;
getline(fin,ts);
for (i=0; i<n; i++)
{
getline(fin,ts);
for (j=0; j<ts.length(); j++)
if (ts[j]!=' ')
p[i][0]=p[i][0]*10+ts[j]-'0';
else
break;
for (j++; j<ts.length(); j++)
p[i][1]=p[i][1]*10+ts[j]-'0';
}
fin.close();
}
void Sell1()
{
bool f[MAX]={false};
int i,j,nt=n;
for (i=0; i<n; i++)
if (p[i][1]-m<=p[i][0])
{
ans+=p[i][0];
nt--;
f[i]=true;
}
for (i=0; i<n; i++)
if (f[i])
for (j=i+1; j<n; j++)
if (!f[j])
{
f[i]=false;
f[j]=true;
p[i][0]=p[j][0];
p[i][1]=p[j][1];
}
n=nt;
}
int max(int a, int b)
{
if (a>b)
return a;
else
return b;
}
void Dyna()
{
int f[10000][MAX]={{0}};
int d[MAX];
int i,j;
for (i=0; i<n; i++)
d[i]=p[i][2]-p[i][1]-m;
for (i=1; i<10000; i++)
{
for (j=0; j<n; j++)
if (d[j]>i)
f[i][j]=f[i][j-1];
else
f[i][j]=max(f[i][j-1],f[i-d[j]][j-1]+p[j][0]);
if (f[i][n-1]>=m)
{
ans-=i;
break;
}
}
}
void Sell2()
{
for (int i=0; i<n; ans+=p[i++][1]);
ans-=n*m;
}
void Output()
{
ofstream fout(O_F);
fout<<ans<<'\n';
fout.close();
}