• SGU 246. Black & White(数论)


    题意:

      有2*n-1个黑色和白色的珠子组成的环形项链,求至少需要多少颗黑色珠子才能使任意排列的项链中都存在两个黑珠间有n个珠子.

          (2*n-1<=2^31-1);

    Solution:

      先分析n=5,n=7,n=9的情况.

          当2*n-1=5,必须有两颗黑珠距离为1(较短的方向).

             2*n-1=7,必须有两颗黑珠距离为2.

             2*n-1=9,必须有两颗黑珠距离为3.

          可以发现 对k=2*n-1,必须存在两颗黑珠的距离为l=(k/2-1)

      假设问题的答案是ans,

          我们先来求ans-1,即最多的不满足问题条件的黑珠数

          假设已经放下了一颗黑珠子位于t。那么距离t+l的地方,t+l*2,t+l*3....这些位置我们可以连起来.显然在在环内每隔1个位置放黑珠能放最多.

              有两种情况,一种是连起来的边只形成了一个环,那么ans-1=(2*n-1)/2,

                             另一种是形成了多个环,那么ans-1=len1/2+len2/2....+leni/2  ,leni为每个环的长度.

          接下来就是数学问题,可以通过求2*n-1,和l的最小公倍数来判断和求出上面所需要的值.

    #include <iostream>
    
    using namespace std;
    int n, ans;
    
    int gcd( int a, int b )
    {
        return b == 0 ? a : gcd( b, a % b );
    }
    int main()
    {
        cin >> n;
        int k = ( n >> 1 ) - 1;
        int d = gcd( n, k );
        int m = n / d, t = n / m;
        ans += t * ( m / 2 );
        n -= t * m;
        ans += n / 2;
        cout << ans + 1 << endl;
    }
    View Code
  • 相关阅读:
    leetcode5 Longest Palindromic Substring
    leetcode17 Letter Combinations of a Phone Number
    leetcode13 Roman to Integer
    leetcode14 Longest Common Prefix
    leetcode20 Valid Parentheses
    leetcode392 Is Subsequence
    leetcode121 Best Time to Buy and Sell Stock
    leetcode198 House Robber
    leetcode746 Min Cost Climbing Stairs
    tomcat下使用druid配置jnid数据源
  • 原文地址:https://www.cnblogs.com/keam37/p/4590436.html
Copyright © 2020-2023  润新知