啊。原来DP还能这么用。这也叫DP啊=。=(汗
开始学长推荐的时候说是DP我就在想这方程怎么凑。不过越想越不靠谱。3个未知量啊,难道要我DP三次?
恐怕要枚举吧。这样想着。枚举2个变量然后对第三个变量DP。但是仍旧写不出方程。
然后想一下,在两个变量确定了之后能够确定什么。对了,ps*a[i][1]+pb*a[i][2]是可以确定的。所以说我可以设k[i] = ps*a[i][1]+pb*a[i][2]。那么实际上我可以通过k[0]+a[0][0]*pg>=k[i]+a[i][0]*pg来把pg的范围求出来。然后取个最小值。然后就这么做了。
然后第5个system case没过。开始我还以为数据错了-。=|||又重新看了遍题意,才发现。。。原来不是说0号一定要第一啊混蛋-。=!!
所以说,这个问题其实是要求在ps和pb确定的情况下,0号可能达到的最小rank的最小pg值。然后我就一直想不清楚这个最小rank要怎么确定。因为pg不知道啊!好了,pg不知道就枚举pg呗。开始我还真不敢想枚举。就是这个地方没想清楚。看了大牛的代码,又想了一下,其实对于k[0]+a[0][0]*pg这个pg必然是满足k[i]+a[i][0]*pg<=k[0]+a[0][0]*pg<=k[j]+a[j][0]*pg的那个pg值。所以说其实就是(k[0]-k[i])/(a[0][0]-a[i][0])的解(这个在前面那里想到了)。但是因为有取floor还是ceil的问题所以说要考虑左右各1的误差。然后就把得到的这些解存起来排个序(不排序也行。加个判断。见代码。)。然后就可以找到你想要的解了,呵呵:)
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
class BestResult {
public:
vector<int> findBestResult(vector<string>);
};
vector<int> BestResult::findBestResult(vector <string> teams)
{
int pg,ps;
int i,j,kx,ky,kz;
int a[20][20],res[20];
int n = teams.size();
int cur = n+1;
vector<int> pp;
for(i = 0;i<n;i++)
{
istringstream sin(teams[i]);
sin>>a[i][0]>>a[i][1]>>a[i][2];
}
for(pg = 1;pg<=1000;pg++)
{
for(ps = 1;ps<=pg;ps++)
{
res[0] = pg*a[0][0]+ps*a[0][1];
pp.clear();
for(i = 1;i<n;i++)
{
res[i] = pg*a[i][0]+ps*a[i][1];
if(a[0][2]!=a[i][2])
{
int tmp = (res[0]-res[i])/(a[i][2]-a[0][2]);
for(j = -1;j<=1;j++)
if(tmp+j<=ps&&tmp+j>=1)pp.push_back(tmp+j);
}
}
int t = pp.size();
// int cnt = 0;
for(i = 0;i<t;i++)
{
int cnt = 0;
for(j = 1;j<n;j++)
if(res[0]+a[0][2]*pp[i]<res[j]+a[j][2]*pp[i])
cnt++;
if(cnt<cur||(cnt==cur&&kx==pg&&ky==ps&&kz>pp[i]))
{
cur = cnt;
kx = pg;
ky = ps;
kz = pp[i];
}
}
}
}
vector<int> ans;
if(cur == n+1)
{
ans.push_back(1);
ans.push_back(1);
ans.push_back(1);
}
else
{
ans.push_back(kx);
ans.push_back(ky);
ans.push_back(kz);
}
return ans;
}