Lotto 迭代算法 cpp


题目内容:

给定N个数字,再从中选定M个数字出来。

将每一种组合内的数字又小到大排列之后,将所有组合按照字典序排列,

请你找到第X组的第Y个数字。

给定的数字为1~N。

范例:

范例1:

(N,M,X,Y) = (5,2,8,2)

所有组合按顺序排列为:

(1 2), (1 3), (1 4), (1 5), (2 3),

(2 4), (2 5), (3 4), (3 5), (4 5)

  所以第8组第2个数字为4。


输入格式:

第一行有一个数字T代表有多少组测试案例。

每一组测试案例一共一行。

这一行有四个数字 N M X Y。

意义如上所述。

测试案例范围:


T < 1000

1 < N < 12

1 < M < N

0 < X <= C(N, M)

0 < Y <= N


输出格式:


对于每一个测试案例,找到第X组第Y个数字。

将所有测试案例的答案加和后再输出。


输入样例:

2

5 2 8 2

6 3 7 3


输出样例:

10

时间限制:500ms内存限制:32000kb

代码实现:

采用迭代的方式,分析每组数字的进位规则进行迭代。


#include <iostream>

inline void printArray(int array[], int len)
{
	for(int i=0;i<len;i++)
	{
		std::cout<<array[i]<<" ";
	}
	std::cout<<std::endl;
}

inline void getNext(int array[], int len, int n){
	int i, cur;
    cur = len - 1;
    while (array[cur] >= cur + n - len + 1){
    	cur--;
	}
    array[cur]++;
    for (i = cur + 1; i < len; i++){
    	array[i] = array[i - 1] + 1;
	}
}
int main(){
	int test_num, i, j;
    int n, m, x, y, sum = 0;
    std::cin >> test_num;
    for (j = 0; j<test_num; j++){
    	std::cin >> n >> m >> x >> y;
        int* array = new int[m];
        for (i = 1; i <= m; i++){
        	array[i - 1] = i;
        }
        for (i = 2; i <= x; i++){
        	getNext(array, m, n);
		}
        sum += array[y - 1];
        delete [] array;
    }
    
    std::cout << sum;
    return 0;
}
全部评论

相关推荐

2025-12-28 20:47
已编辑
北京工商大学 Java
程序员牛肉:我靠你这个实习经历其实最需要担心的点是你做的太多了,可能会被面试官怀疑是你伪造的。 交易状态机是你做的,支付多渠道是你做的,对账是你做的,结算还是你做的,重复支付也是你做的,整个服务的异常处理也是你做的。 其实你这个反而问题很大的,你想想站在面试官的角度,他是真的会相信你的能力很强,还是相信这份实习你伪造了大部分?我相信你真的做了这么多,但是删一些,废话删一删。你这个做的太多了反而真实性不可信。 后面再补一个项目,在github上找一个高star的项目学一学然后写到自己简历上。我觉得你能力肯定没问题。28届能做到这个份上很厉害,但是在求职市场中,你不是在跟28届的同学比,把你这个简历放到27届其实也就一般水平。 所以后续要想一想看看能不能给自己简历上搞点亮点,比如开源贡献呢?比如博客呢?
实习要如何选择和准备?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务