文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Topcoder Open 2011 Qualification Round 3报告

Topcoder Open 2011 Qualification Round 3报告

时间:2011-05-25  来源:Skyprophet

第一篇竞赛报告……TCO的前两场QR的情况不容乐观,所以把我逼得起早做TCO QR3。最终rank498,rate有微微上涨(不调到DIV2我就很高兴了~)。总体情况问题在于熟练程度,最大的问题就是手速。前两题不难,之所以rank很低原因就在于调试浪费了大量时间。准确的说浪费最多时间的是从写完程序到编译通过这个阶段,看来我的记事本程序设计功力不够啊~

TC这种比赛的程序最猥琐的地方在于,他并不是让你写一个单纯的程序。而是需要将它封装在class中,这给编译和调试带来了很大的不便。从这个侧面我的这个静态差错能力还是不行,更严重的问题可能在于过分依赖IDE和gdb,在没办法进行这样常规意义上的调试的时候显得不知所措。看来近期需要在刷题的时候多多注意了,静态差错和活用输出进行debug才是王道~

这份报告只会写前250pt和500pt,主要是因为1000pt还没有太想好,搞定后我会找时间把那个题补上。

250pt:一道很水的题,需要注意的地方主要在于-1的问题。因为他希望刚好能被n - 1个数整除,除了需要枚举一个点排除掉做LCM之外最后还要检测下能不能被被搞掉的那个数整除。总体上讲没什么好说的。这个题浪费了很多时间,直接导致了这次考试的一堆问题。(P.s.下回他给你的对象名啊函数名啊就直接复制粘贴吧,要不然敲错了会有诡异错误……)

#include <vector>
#include <iostream>
using namespace std;

int gcd(int x, int y)
{
        if (0 == y) return x;
        return gcd(y, x % y);
}

class AllButOneDivisor
{
        public:
                int getMinimum(std::vector <int> divisors)
                {
                        int best = 100000000;
                        for (int i = 0; i < divisors.size(); i++)
                        {
                                int lcms;
                                if (i == 0)
                                {
                                        lcms = divisors[1];
                                        for (int j = 2; j < divisors.size(); j++)
                                                lcms = (divisors[j] * lcms / gcd(lcms, divisors[j]));
                                }
                                else
                                {
                                        lcms = divisors[0];
                                        for (int j = 1; j < divisors.size(); j++)
                                        if (i != j)
                                                lcms = (divisors[j] * lcms / gcd(lcms, divisors[j]));
                                }
                                if (best > lcms && lcms % divisors[i] != 0) best = lcms;
                        }
                        if (best == 100000000) return -1;
                        return best;
                }
};

 

500pt:这个题看起来挺唬人的,也是一个比较简单的问题。因为我们希望游戏尽量长,所以操作的方法就是按照实际消耗的money的多少排序,然后去贪心。这个方法一定正确因为每次损失的越少的话,才能给之后的损失多的打下基础,并且保证了need的供应。这个题本来想排序搞的,后来觉得悲剧,就直接写了个线性扫描求最小值。虽然效率会有一点损失,但是对于TC这种题目,超时应该是最不容易出现的问题。所以在代码上能精简就精简,怎么好写就怎么写,这样才能在保证最后不被人CHA和通过system test的情况下将分数所得分数最大化。

#include <vector>
#include <iostream>
using namespace std;

class CoinMachinesGame
{
        public:
                int maxGames(int coins, vector <int> need, vector <int> give)
                {
                        int ans = 0;
                        while (coins > 0)
                        {
                                int bestcost = 10000, next = 0;
                                for (int i = 0; i < need.size(); i++)
                                        if (coins >= need[i] && bestcost > need[i] - give[i])
                                        {
                                                bestcost = need[i] - give[i];
                                                next = i;
                                        }
                                if (bestcost == 10000) break;
                                ans += (coins - need[next]) / bestcost + 1;
                                coins = coins - (((coins - need[next]) / bestcost + 1) * bestcost);
                        }
                        return ans;
                }
};
相关阅读 更多 +
排行榜 更多 +
翌日波奇狗的历险记手机版下载

翌日波奇狗的历险记手机版下载

休闲益智 下载
怪兽远征安卓版下载

怪兽远征安卓版下载

角色扮演 下载
谷歌卫星地图免费版下载

谷歌卫星地图免费版下载

生活实用 下载