您的位置:首页 > 运维架构

TopCoder East China College Tour Round 1 Div 1 1000Points

2010-11-03 13:36 393 查看
啊。原来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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  div vector ini system string