C# 从不同的数字组中选择2个数字的方法数的C解决方案
我想解决的问题是这样的 给我N,告诉我数字的范围是0,1,…,N-2,N-1 我还得到了配对,告诉我这些数字对在同一组中 例: N=6,0和1是成对的,1和4是成对的,2和3是成对的,我知道剩余的数字在它们自己的组中 然后我知道分组是{0,1,4},{2,3},{5} 从这些组中的不同组中选择两个数字的方法是11,这就是我试图解决的数字。这些选择包括: {0,2}, {0,3}, {0,5}, {1,2}, {1,3}, {1,5}, {4,2}, {4,3}, {4,5}, {2,5}, {3,5} 有人能帮我找出我的逻辑哪里错了吗?因为我没有通过更大的测试用例,通过了更小的测试用例 我的代码: 例如,我通过了考试C# 从不同的数字组中选择2个数字的方法数的C解决方案,c#,algorithm,data-structures,time-complexity,number-theory,C#,Algorithm,Data Structures,Time Complexity,Number Theory,我想解决的问题是这样的 给我N,告诉我数字的范围是0,1,…,N-2,N-1 我还得到了配对,告诉我这些数字对在同一组中 例: N=6,0和1是成对的,1和4是成对的,2和3是成对的,我知道剩余的数字在它们自己的组中 然后我知道分组是{0,1,4},{2,3},{5} 从这些组中的不同组中选择两个数字的方法是11,这就是我试图解决的数字。这些选择包括: {0,2}, {0,3}, {0,5}, {1,2}, {1,3}, {1,5}, {4,2}, {4,3}, {4,5}, {2,5}, {3
[TestMethod]
public void Sample1()
{
int N = 5;
Tuple<int, int>[] pairs = new Tuple<int, int>[]
{
Tuple.Create(0, 1),
Tuple.Create(2, 3),
Tuple.Create(0, 4)
};
Assert.AreEqual(6, PoliticallyCorrectPairs(N, pairs));
}
但失败
[TestMethod]
public void TestCase2()
{
int N = 100;
Tuple<int, int>[] pairs =
@"0 11
2 4
2 95
3 48
4 85
4 95
5 67
5 83
5 42
6 76
9 31
9 22
9 55
10 61
10 38
11 96
11 41
12 60
12 69
14 80
14 99
14 46
15 42
15 75
16 87
16 71
18 99
18 44
19 26
19 59
19 60
20 89
21 69
22 96
22 60
23 88
24 73
27 29
30 32
31 62
32 71
33 43
33 47
35 51
35 75
37 89
37 95
38 83
39 53
41 84
42 76
44 85
45 47
46 65
47 49
47 94
50 55
51 99
53 99
56 78
66 99
71 78
73 98
76 88
78 97
80 90
83 95
85 92
88 99
88 94"
.Split('\n')
.Select(line =>
{
int[] twofer = line.Split(' ').Select(s => int.Parse(s)).ToArray();
return Tuple.Create(twofer[0], twofer[1]);
})
.ToArray();
Assert.AreEqual(3984, PoliticallyCorrectPairs(N, pairs));
}
知道我哪里出错了吗?问题出在组合部分:
if(gmap[i] != gmap[j])
{
for(int m = 0; m < n; ++m)
if(gmap[m] == gmap[j]) // here
gmap[m] = gmap[i];
}
“假设我知道0和1在同一组中”——为什么?从不同的组中选择两个数字的方法是11为什么?@LeiYang如果你只阅读代码的注释,这是有意义的。他在几个地方把解释搞砸了。@Slepz很好,但OP最好给一个真正的单词使用者story@LeiYang怀疑这是可能的,这看起来像是一个CS任务。
if(gmap[i] != gmap[j])
{
for(int m = 0; m < n; ++m)
if(gmap[m] == gmap[j]) // here
gmap[m] = gmap[i];
}
if(gmap[i] != gmap[j])
{
int g = gmap[j];
for(int m = 0; m < n; ++m)
if(gmap[m] == g)
gmap[m] = gmap[i];
}