挑战程序设计竞赛_抽签问题及优化

问题描述及思路概述:

* 将n个纸片放入口袋中,每张纸片上写一个数

* 每次从中抽取一个,记录并且放回,抽取四次

* 问和能否为m

* 若能输出Yes,否则输出No

* 样例输入:

* n = 3

* m = 10

* k = {1, 3, 5};

* 输出:

* Yes(1+1+3+5)

* 思路:

* 1.暴力枚举,四重循环,枚举所有情况 O(n^4)

* 2.优化最后一次的查询,前三重循环枚举前三次所有抽取的情况

* 最后用二分查找bin(m-A[n] + B[n] + C[n],D) O(n^3*lgn)

* 3.基于第二种方法考虑,枚举前两次抽签的情况,记录sum[n*n];在用两重循环二分查找

* bin(m-(C[n] + D[n]),sum) O(n^2*lgn)

java代码实现如下

import java.util.Arrays;

import java.util.Scanner;

public class 抽签问题及优化 {

static int n;

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

n = sc.nextInt();//n张纸片

int m = sc.nextInt();//所求和

int[] k = new int[n];//模拟每张纸片所代表的数

for(int i = 0; i < n; i++) {

k[i] = sc.nextInt();

}

//solve1(k, m, n);

//solve2(k, m, n);

solve(k, m, n);

}

/**

* 四个数分隔成两两一对,枚举前两次抽取结果,二分查找

* @param k

* @param m

* @param n2

*/

private static void solve(int[] k, int m, int n) {

boolean ans = false;

int[] towSum = new int[n*n];

for(int i = 0; i < n; i++) {

for(int j = 0; j < n; j++) {

towSum[n*i+j] = k[i] + k[j];//记录

}

}

//二分查找

Arrays.sort(towSum);

for(int i = 0; i < n; i++) {

for(int j = 0; j < n; j++) {

if(Arrays.binarySearch(towSum, m - k[i] - k[j]) >= 0)

ans = true;

}

}

if(ans)

System.out.println("Yes");

else

System.out.println("No");

}

/**

* 枚举前三次抽取结果+二分查找

* @param k

* @param m

* @param n

*/

private static void solve2(int[] k, int m, int n) {

boolean ans = false;

Arrays.sort(k);

for(int i = 0; i < n; i++) {

for(int j = 0; j < n; j++) {

for(int l = 0; l < n; l++) {

if(Arrays.binarySearch(k, m - k[i] - k[j] - k[l]) >= 0)

ans = true;

}

}

}

if(ans)

System.out.println("Yes");

else

System.out.println("No");

}

/**

* 暴力枚举

* @param k

* @param m

* @param n

*/

private static void solve1(int[] k, int m, int n) {

boolean ans = false;

for(int i = 0; i < n; i++) {

for(int j = 0; j < n; j++) {

for(int r = 0; r < n; r++) {

for(int l = 0; l < n; l++) {

if(k[i]+k[j]+k[r]+k[l] == m)

ans = true;

}

}

}

}

if(ans)

System.out.println("Yes");

else

System.out.println("No");

}

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 4,092评论 0 2
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,157评论 0 2
  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 2,087评论 0 2
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    开心的锣鼓阅读 3,404评论 0 9
  • 二宝萌萌三岁多了,今年九月一号刚入学,到现在快两个月了,每次喊她起床的时候她都是不情愿的,我也能理解这么小的娃想赖...
    冰山雪莲1981阅读 263评论 0 3

友情链接更多精彩内容