zoukankan      html  css  js  c++  java
  • SRM 596 DIV 2

    前段时间终于配置好了TopCoder的环境,所以就拿这场的DIV2练习了一下

    1. 250pt FoxAndSightseeing

    题意

    给你n个城市的位置,他们在同一直线上,要求你跳过其中某一个城市,按顺序依次访问其他的城市,求距离的最小值

    题解

    由于数据规模为n<=50,所以直接枚举就好

    代码:

    class FoxAndSightseeing
    {
            public:
            int getMin(vector <int> position)
            {
                    int ans=INF;
                    for(int i=1;i<position.size()-1;i++)
                    {
                           int sum=0,pre=position[0];
                           for(int j=1;j<position.size();j++)
                           {
                                  if(j==i) continue;
                                  sum+=abs(position[j]-pre);
                                  pre=position[j];
                           }
                           if(sum<ans) ans=sum;
                    }
                    return ans;
            }
    };

    2. 500pt ColorfulRoa

    题意

    给定n个点,每个点有一个颜色(R,G,B分别表示红绿蓝),要求你选择其中的一些点,使得总花费最少。在选择的点中,相邻的两点之间有一个花费,假设选择了i和j,那么花费就是(i-j)*(i-j),另外要求你选择的点的颜色按顺序依次是R,G,B,R,G,B。。。。

    题解

    很水的DP,方程为dp[i]=min(dp[i],dp[j]+(i-j)*(i-j))((cr[j]=='R'&&cr[i]=='G')||(cr[j]=='G'&&cr[i]=='B')||(cr[j]=='B'&&cr[i]=='R'))

    代码:

    int dp[20];
    bool check(char a,char b)
    {
        return (a=='R'&&b=='G')||(a=='G'&&b=='B')||(a=='B'&&b=='R');
    }
    class ColorfulRoad
    {
    public:
        int getMin(string road)
        {
            int i,j;
            memset(dp,INF,sizeof(dp));
            dp[0]=0;
            FOR(i,1,road.size()-1)
            REP(j,i)
            if(check(road[j],road[i]))
                dp[i]=min(dp[i],dp[j]+(i-j)*(i-j));
            return dp[road.size()-1]==INF?-1:dp[road.size()-1];
        }
    };

    3. 1000pt SparseFactorialDiv2

    题目大意

    对于整数n,我们定义F(n) = (n - 0^2) * (n - 1^2) * (n - 2^2) * (n - 3^2) * ... * (n - k^2),k为使得n-k^2>0的最大整数。给定lo,hi,和p(是一个素数),请你计算lo<=n<=hi中能够使得F(n)可以被divisor整除的n的个数

    题解

    因为p是素数,如果F(n)能够被p整除,说明F(n)的某一个因子(n-i^2)可以被p整除

    用数学表示为(n-i^2)%p==0

    n≡i^2(mod p)

    n=i^2+x*p

    那么对于每一个i,我们就有x=(n-i^2)/p个符合情况,我们只需要枚举i即可,不过需要注意一点的是这样会重复计算,因此如果i^2≡j^2(mod p)(i<j) 那么如果在j的时候的x也算入答案中的话就多算了,因为我们在i的时候已经计算过了,那如何处理这种情况呢?只需要对余数判重即可,即如果i^2%p已经存在,那么此时的x不计入答案,把没个符合要求的x累加起来就是最终的答案

    代码:

    map<LL,int>ms;
    LL getAns(LL r,LL p)
    {
        ms.clear();
        LL ans=0;
        for(LL i=0; i*i<=r; i++)
        {
            if(ms[i*i%p]) continue;
            ans+=(r-i*i)/p;
            ms[i*i%p]++;
        }
        return ans;
    }
    class SparseFactorialDiv2
    {
    public:
        LL getCount(LL lo, LL hi, LL divisor)
        {
            return getAns(hi,divisor)-getAns(lo-1,divisor);
        }
    };
  • 相关阅读:
    SD卡测试
    测试人员可能会遇到的问题
    HDU 1024 Max Sum Plus Plus
    HDU 1176 免费馅饼
    HDU 1257 最少拦截系统
    HDU 1087 Super Jumping! Jumping! Jumping!
    poj 1328 Radar Installation
    poj 1753 Flip Game
    HDU 1003 Max Sum
    HDU 5592 ZYB's Premutation(BestCoder Round #65 C)
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/3439257.html
Copyright © 2011-2022 走看看