设计思路:
如果每次删除四个不同的ID,那么,在剩下的ID列表中,原先发帖比例大于1/4的ID所占比例仍然大于1/4,可以通过不断重复这个过程,把ID列表中的ID总数降低(转化为更小的问题),从而得到问题的答案。
程序代码:
#include<iostream> using namespace std; void FindID(int ID[],int n,int rightID[]); void main() { int ID[16] = {1,1,2,2,3,3,3,1,2,3,1,2,3,6}; int n = 16; int waterID[3]; FindID(ID,n,waterID); cout << "符合条件的ID分别是:" << endl; for(int i = 0;i < 3;i++) { cout << waterID[i] << " " << endl; } } void FindID(int ID[],int n,int waterID[]) { int falseID = -1; int number[3]; number[0] = number[1] = number[2] = 0; waterID[0] = waterID[1] = waterID[2] = falseID; for(int i = 0;i < n;i++) { if(ID[i] == waterID[0]) { number[0]++; } else if(ID[i] == waterID[1]) { number[1]++; } else if(ID[i] == waterID[2]) { number[2]++; } else if(number[0] == 0) { number[0] = 1; waterID[0] = ID[i]; } else if(number[1] == 0) { number[1] = 1; waterID[1] = ID[i]; } else if(number[2] == 0) { number[2] = 1; waterID[2] = ID[i]; } else { number[0]--; number[1]--; number[2]--; } } }
结果截图:
个人总结:
将实际问题转化为变量需要很复杂的变换。虽然只遍历了一次数组,但是需要对number,waterID数组比较很多次。这次与上次思路相同,把4个不同的ID相消即可。