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);
        }
    };
  • 相关阅读:
    iOS No suitable application records were found. Verify your bundle identifier 'xxx' is correct.
    隐私安全加密
    python-标示符和关键字
    Xcode打包提交至itunes connect后,提交审核成功,随后出现二进制文件无效
    linking against a dylib which is not safe for use in application extensions
    CH收藏的书
    颜色管理
    子线程回到主线程
    python- if-else
    安卓手机传递文件到Windows系统电脑
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/3439257.html
Copyright © 2011-2022 走看看