列表

详情


NC213932. 抽签游戏

描述

由于YS在国庆之前偷偷把作业给AK掉了,于是TQC提议玩一个小游戏,将写有数字的N个纸片放入盒子 YS每次可以从盒子中抽取一个纸片,并将其放回盒子中,YS一共可以抽取四次,TQC给出一个数字M,如果LZH四次抽到的数字之和等于M,那么YS就会平安无事,否则TQC 会给他最喜爱的大嘴巴子。但是YS玩了几次抽签游戏,每次都获得了他最喜爱的大嘴巴子,他怀疑TQC在搞他,于是他恼羞成怒,怒把盒子打开看看里面的到底能不能抽四次的数字之和等于M,
现在给你一个盒子 要求你帮YS检查一下盒子里面的卡片是否真的可以满足上述条件

输入描述

第一行有一个数n 代表卡片数量    1<n<50 第二行有一个数M,M的意义如题      1<m<1000 第三行有n个数,代表n张卡片上面所写的数值    1<每个数字<1000

输出描述

如果抽四次可以满足上述条件 输出 YES 否则输出 NO

示例1

输入:

5
10
1 2 3 4 5

输出:

YES

说明:

1+2+3+4=10
所以该

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java(javac 1.8) 解法, 执行用时: 29ms, 内存消耗: 12252K, 提交时间: 2021-01-26 23:11:07

import java.util.Arrays;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int m = scanner.nextInt();
		int k[] = new int[n];
		for (int i = 0; i < n; i++) {
			k[i] = scanner.nextInt();
		}
		int []k12 = new int [n*(n + 1)/2];
		int index = 0;
		for (int i = 0; i < k.length; i++) {
			for (int j = i; j < k.length; j++) {
				k12[index] = k[i] + k[j];
				index++;
			}
		}
        int []k14 = new int [n*(n + 1)*(n*n + n + 2)/8];
		index = 0;
		for (int i = 0; i < k12.length; i++) {
			for (int j = i; j < k12.length; j++) {
				k14[index] = k12[i] + k12[j];
				index++;
			}
		}
		Arrays.sort(k14);
		int low = 0;
		int hight = k14.length;
		while (low <= hight) {
			int mid = (low + hight) / 2;
			if (k14[mid] == m) {
				System.out.println("YES");
				return;
			}else if (m > k14[mid]) {
				low = mid + 1;
			}else {
				hight = mid - 1;
			}
		}
		System.out.println("NO");
	}

}

C(clang11) 解法, 执行用时: 2ms, 内存消耗: 376K, 提交时间: 2020-11-24 22:04:33

#include<stdio.h>
int main()
{
    int n,m,a[50];int k=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int j=1;j<=n;j++){
        for(int i=1;i<=n;i++){
            for(int s=1;s<=n;s++){
                for(int t=1;t<=n;t++){
                    if(a[i]+a[j]+a[s]+a[t]==m) k=1;
                }
            }
        }
    }
    if(k) printf("YES");
    else printf("NO");
    return 0;
}

C++(clang++11) 解法, 执行用时: 3ms, 内存消耗: 384K, 提交时间: 2020-12-02 13:37:53

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[107],n,k,i,x1,x2,x3,x4,ans=0;
	cin>>n;
	cin>>k;
	for(i=0;i<n;i++)
	cin>>a[i];
	for(x1=0;x1<n;x1++)
	{
		for(x2=0;x2<n;x2++)
		{
			for(x3=0;x3<n;x3++)
			{
				for(x4=0;x4<n;x4++)
				{
					if(a[x1]+a[x2]+a[x3]+a[x4]==k)
					ans=1;
				
				}
			}
		}
	}
	if(ans)
	cout<<"YES"<<endl;
	else
	cout<<"NO"<<endl;
	return 0;
 } 

Python3(3.9) 解法, 执行用时: 19ms, 内存消耗: 2680K, 提交时间: 2020-11-24 13:28:03

import itertools

k = 0
n = int(input())
m = int(input())

array = [int(st) for st in input().split(' ')]

for lst in itertools.combinations_with_replacement(array, 4):
    if sum(lst) == m:
        k = k + 1
        if k == 1:
            print('YES')

if k == 0:
    print('NO')

上一题