水王问题(面试题):
解法一:排序后中间的id即为水王
解法二:自己没有想出来就请教度娘有两种理解(殊途同归而已)本人喜欢第二种
1.每次删除两个不同的id剩余id中水王肯定占剩余id的1/2强调字眼“不同”,所以删下去吧
2.不同记为是一个挑战相同记为一个支持,只有水王“牛”他能迎接所有挑战(支持>挑战)活到最后。
代码:
1 //水王 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 int a = 0; 7 int b = 0; 8 int i; 9 int arrays[10]; 10 for (i = 0; i < 10; i++) 11 { 12 cin >> arrays[i]; 13 } 14 15 for (i = 0; i < 10; i++) 16 { 17 if (a == 0 || b == 0) 18 { 19 a = arrays[i]; 20 b++; 21 } 22 else if (arrays[i] == a) 23 b++; 24 else 25 b--; 26 } 27 cout << a; 28 }
截图:
水王扩展:有3个人的id超过整体的1/4找这3个人。
解法:借用上面解法一的思考我们每回合删4个不同id,剩下id中3个准水王还是超过1/4的可以反过来想怎么能使水王不超过1/4,只有删除相同的水王,所以验证了前面。想了一会儿得出的。
代码:
1 #include <iostream> //水王扩展问题 2 using namespace std; 3 4 int main() 5 { 6 int idpoint[3]; //存放3水王id 7 int nTimes[3]; //存放记录每个水王的重复的次数 8 int i; 9 int id[20] = {1,1,1,1,2,2,2,2,3,3,3,3,1,2,3,5}; 10 //for (i = 0; i < 20; i++) 11 //{ 12 // cin >> id[i]; 13 //} 14 idpoint[0] = id[0]; //可以赋值为无意义的id 15 idpoint[1] = id[1]; 16 idpoint[2] = id[2]; 17 nTimes[0] = nTimes[1] = nTimes[2] = 0; 18 for (i = 3; i < 16; i++) 19 { 20 if (idpoint[0] == id[i]) 21 nTimes[0]++; 22 else if (idpoint[1] == id[i]) 23 nTimes[1]++; 24 else if (idpoint[2] == id[i]) 25 nTimes[2]++; 26 else if (nTimes[0] == 0) 27 { 28 idpoint[0] = id[i]; 29 nTimes[0]++; 30 } 31 else if (nTimes[1] == 0) 32 { 33 idpoint[1] = id[i]; 34 nTimes[1]++; 35 } 36 else if (nTimes[2] == 0) 37 { 38 idpoint[2] = id[i]; 39 nTimes[2]++; 40 } 41 else 42 { 43 nTimes[0]--; 44 nTimes[1]--; 45 nTimes[2]--; 46 } 47 } 48 cout << idpoint[0] << " " << idpoint[1] << " " << idpoint[2] << endl; 49 return 0; 50 }