zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    基于决策树和智能搜索系统
    基于神经网络的人工智能系统
    身边的人工智能&人工智能发展史
    Linux简介和环境的搭建
    回来啦
    顺序表
    方格计数
    2000年的1月1日,是那一年的第1天。 那么,2000年的5月4日,是那一年的第几天?
    十三、排序算法
    十二、预处理
  • 原文地址:https://www.cnblogs.com/keam37/p/4590436.html
Copyright © 2011-2022 走看看