标签:
题目链接:
http://acm.bnu.edu.cn/v3/problem_show.php?pid=24251
数论:
给定1~N, 1~M的编号作为男女的编号
给定Q个查询,每个查询给出一个数字qnum,求出所有男女编号相加等于qnum的组合的情况
最大的组合情况就是N/M中最小的那个数
找规律发现在2~N+M这些数的两侧从1~min(N, M)-1进行排列,其他的位置填上min(N, M)即可
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 #define clr(c) memset(c, 0, sizeof(c)); 7 const int MAXL = 200000+5; 8 int ans[MAXL]; 9 int t, n, m, q, qnum; 10 11 void pro(){ 12 int maxnum = min(n, m); 13 int sum = n+m; 14 for(int i = 1; i < maxnum; i++){ 15 ans[2+i-1] = i; 16 ans[sum-i+1] = i; 17 } 18 for(int i = 2+maxnum-1; i <= sum-maxnum+1; i++){ 19 ans[i] = maxnum; 20 } 21 } 22 23 int result(){ 24 if(qnum > n+m || qnum == 0 || qnum == 1) return 0; 25 else{ 26 return ans[qnum]; 27 } 28 } 29 30 int main(){ 31 scanf("%d", &t); 32 for(int Case = 1; Case <= t; Case++){ 33 clr(ans); 34 scanf("%d%d", &n, &m); 35 scanf("%d", &q); 36 printf("Case #%d:\n", Case); 37 pro(); 38 while(q--){ 39 scanf("%d", &qnum); 40 printf("%d\n", result()); 41 } 42 } 43 44 return 0; 45 }
标签:
原文地址:http://www.cnblogs.com/miaowTracy/p/4858661.html