转一个算法题目,有兴趣的来

threenewbee 2013-05-13 03:51:13
加精
...全文
10661 356 打赏 收藏 转发到动态 举报
写回复
用AI写文章
356 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingeddx 2014-06-17
  • 打赏
  • 举报
回复
把1看成顶点,拿掉3,4,7,9 。。。 我的思路是:把10个拿空,最多放几个,我就放到6个,就不能再放了
chenzhihuasilao 2014-06-17
  • 打赏
  • 举报
回复
引用 31 楼 fatg1988 的回复:
2 6 8 3 4 9
这样17 10 也可以组成啊
zdczdccccc 2014-06-17
  • 打赏
  • 举报
回复
1、7、10肯定要拿走一个,先假设拿走1,因为5组成最多三角,拿走5,除去1、5剩下可以组成三角的只有279、268、349、3810、478、6910,要以拿走最少的数使他们无效,一看便知是8、9,因此1589成立 同理,拿走7和10也都各存在一种情况 最后答案是1589、24510、3567
tinydyw 2014-06-14
  • 打赏
  • 举报
回复
1.先取中间的核心5 2.将5和3个定点分别连接得到3条轴线,将三角形分成三块 3.任意去掉1条轴线上的所有点,如选51轴线上的1 4.去掉和轴线不相邻的块中的所有点8 9 5.剩下两块中分别去掉能形成三角形的点...这里每块只有2个点,这一步就直接跳过了. 因此最少需要去掉4个点...当然也可以选择其他的轴线和其对应的块,,所以至少应该有3解..
keyboard3_ 2014-06-13
  • 打赏
  • 举报
回复
应该有四个吧!1,5,7,10--1,5,8,9--7,5,3,6--10,5,2,4
gis_99 2014-06-13
  • 打赏
  • 举报
回复
我想了半天,1 5 8 9 四个取走 剩下的任意3个蓝莓不能构成等边三角形
tinydyw 2014-06-13
  • 打赏
  • 举报
回复
这个算法题....是要求当前解还是求通解= =.....
於黾 2014-06-13
  • 打赏
  • 举报
回复
这个思路应该是没问题,而且可以用代码实现. 每次去掉重复最多的,直到集合为空为止.
於黾 2014-06-13
  • 打赏
  • 举报
回复
1,2,3 1,4,6 1,7,10 2,4,5 2,5,3 2,6,8 2,7,9 3,4,9 3,5,6 3,8,10 4,7,8 4,8,5 5,8,9 5,9,6 6,9,10 把2,6,8和3,4,9加上去,重新筛 先去掉5 1,2,3 1,4,6 1,7,10 2,6,8 2,7,9 3,4,9 3,8,10 4,7,8 6,9,10 再去掉1(或7或10,中心对称的) 2,6,8 2,7,9 3,4,9 3,8,10 4,7,8 6,9,10 这样只能去掉8,9了.
snipes 2014-06-13
  • 打赏
  • 举报
回复
1,5,8,9
koma0529 2014-06-12
  • 打赏
  • 举报
回复
至少得4颗吧
请叫我官人 2014-06-11
  • 打赏
  • 举报
回复
至少得四颗 三个角 中间那个 1 5 7 10
sinat_16393527 2014-06-11
  • 打赏
  • 举报
回复
要不试一下【5,7,3,6】【5,1,8,9】【5,2,4,10】,唯一的三组四个数字的
真心依旧 2013-07-27
  • 打赏
  • 举报
回复
3,5,8,10怎么写起算法来了
  • 打赏
  • 举报
回复
引用 18 楼 Johnyin 的回复:
1,5,7,10 应该是正解了. 具体思路如下: 先将可组成等边三角的数字列出, 如: 1,2,3 1,4,6 1,7,10 ...... 统计出现最多的数字: 得出 5, 第一步先干掉5, 并删除上面含5的组合. 继续统计出现最多的数字: 得出 1,7,10 干掉1, 并删除含一的组合, 循环...得出 7,10直到组合清空.
我也是这样做的~
寂工 2013-07-27
  • 打赏
  • 举报
回复
引用 18 楼 Johnyin 的回复:
1,5,7,10 应该是正解了. 具体思路如下: 先将可组成等边三角的数字列出, 如: 1,2,3 1,4,6 1,7,10 ...... 统计出现最多的数字: 得出 5, 第一步先干掉5, 并删除上面含5的组合. 继续统计出现最多的数字: 得出 1,7,10 干掉1, 并删除含一的组合, 循环...得出 7,10直到组合清空.
借鉴楼上的算法,我列举了所有的等边三角形 1.2.3 2.4.5 3.5.6 4.7.8 5.8.9 6.9.10 1.2.3.4.5.6 2.4.5.7.8.9 3.5.6.8.9.10 1.2.3.4.6.7.8.9.10 统计这么多数列中,各数字的出现次数 1:3; 2:5; 3:5; 4:5; 5:6; 6:5; 7:3; 8:5; 9:5; 10:3; 出现次数最多的5出现了6次,则5应该是最应该去掉的。其次有6个数出现了5次,则这六个数中应该应该间隔去除。所以应该最少去掉4个.....
绿色夹克衫 2013-06-27
  • 打赏
  • 举报
回复
不算旋转的话,只有一种方案,1 5 8 9,算旋转的话有3种。不过我用的方法比较弱,基本上就是枚举,这样的话也就能算到n = 6或7的情况,也就是21或28个蓝莓,算28还得弄比较复杂的剪枝,还没有想清楚有没有多项式时间的算法或者转为dlx来弄。 程序写得比较弱,大家凑合看吧。
using System;
using System.Collections.Generic;

namespace Problem51Nod
{
    class Program
    {
        class Item { public double X, Y;        }

        static void Main(string[] args)
        {
            //4为行数,应该可以算到6,再大有些慢
            Init(4);
            int max = 0;
            List<int> result = new List<int>();
            int upper = 1 << Items.Length;

            for (int i = 0; i < upper; i++)
            {
                int count = Count(i);

                if (Check(i) && count >= max)
                {
                    if (count > max)
                    {
                        max = count;
                        result.Clear();
                    }

                    result.Add(i);
                }
            }

            foreach (var item in result)
            {
                for(int i = 0; i < Items.Length; i++)
                {
                    int mask = 1 << i;
                    if ((item & mask) != mask)
                        Console.Write("{0} ", i + 1);
                }

                Console.WriteLine();
            }

            Console.ReadKey();
        }

        static Item[] Items;
        static int[] CheckInt;

        static int Count(int n)
        {
            int count = 0;
            
            while (n > 0)
            {
                n &= n - 1;
                count++;
            }

            return count;
        }

        static void Init(int n)
        {
            Items = new Item[n * (n + 1) / 2];
            int index = 0;
            double hight = Math.Sqrt(3) / 2;

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j <= i; j++)
                {
                    Items[index] = new Item { X = (double)j - (double)i / 2, Y = i * hight };
                    index++;
                }
            }

            List<int> checks = new List<int>();

            for (int i = 0; i < Items.Length - 2; i++)
                for (int j = i + 1; j < Items.Length - 1; j++)
                    for (int k = j + 1; k < Items.Length; k++)
                        if (Check(Items[i], Items[j], Items[k]))
                            checks.Add((1 << i) + (1 << j) + (1 << k));

            CheckInt = checks.ToArray();
        }

        static bool Check(Item a, Item b, Item c)
        {
            double ab = Distance(a, b);
            double bc = Distance(c, b);
            double ac = Distance(a, c);

            double min = ab;
            double max = ab;
            min = Math.Min(bc, min);
            min = Math.Min(ac, min);
            max = Math.Max(bc, max);
            max = Math.Max(ac, max);
            return max - min < 0.00000001;
        }

        static double Distance(Item a, Item b) { return Math.Sqrt((a.X - b.X) * (a.X - b.X) + (a.Y - b.Y) * (a.Y - b.Y)); }

        static bool Check(int n)
        {
            foreach (var item in CheckInt)
                if ((n & item) == item)
                    return false;

            return true;
        }
    }
}
bobby1991qw 2013-06-26
  • 打赏
  • 举报
回复
3颗 3边上的第二颗
Regan-lin 2013-06-21
  • 打赏
  • 举报
回复
好吧,考虑到大小不一的三角形,排除到只有三个 1 5 7 10 1 5 8 9 3 5 6 7
Regan-lin 2013-06-21
  • 打赏
  • 举报
回复
4颗27种结果 1 4 5 6 1 4 5 9 1 4 5 10 1 5 6 7 1 5 7 9 1 5 7 10 1 5 6 8 1 5 8 9 1 5 8 10 2 4 5 6 2 4 5 9 2 4 5 10 2 5 6 7 2 5 7 9 2 5 7 10 2 5 6 8 2 5 8 9 2 5 8 10 3 4 5 6 3 4 5 9 3 4 5 10 3 5 6 7 3 5 7 9 3 5 7 10 3 5 6 8 3 5 8 9 3 5 8 10
加载更多回复(321)

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧