zoukankan      html  css  js  c++  java
  • 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 G

    链接:https://www.nowcoder.com/acm/contest/122/G
    来源:牛客网

    题目描述

    阿汤同学为了准备下学期的 ACM-ICPC,刷了很多的题目,他觉得自己已经比较厉害了,于是想出个题目考考你。现在他给你一个数组 A,问你是否能将该数组划分成数组 B、C 使得 B 数组的平均数和C 数组的平均数相等,数组 B 和 C 都不能为空。

    输入描述:

    从标准输入读入数据。
    输入包含多组数据,第一行一个整数 T 代表数据组数。接下来依次描述每组数据,对于每组数据:
    第一行输入正整数 N,第二行输入 N 个非负整数

    1≤|A|≤30 (数组 A 的长度范围在 1 到 30 之间 )
    0≤A[i]≤10000 (数组 A 中的元素)

    输出描述:

    输出到标准输出。
    对于每组数据,输出一行:
    如果能划分成满足题目要求的数组 B 和 C 则输出 yes,否则输出no
    示例1

    输入

    1
    8
    1 2 3 4 5 6 7 8

    输出

    yes

    说明

    样例说明:将数组 A 划分成【1,4,5,8】和【2,3,6,7】,平均数为 4.5
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define MAXN 2001000
     4 #define PSIZE 100000
     5 bool Average(vector<int>& A) {
     6         static bool dp[2][16][300001];
     7         int sum = 0;
     8         for (int a: A) sum += a;
     9 
    10         int N = A.size();
    11         memset(dp, 0, sizeof(dp));
    12         for (int n = 0; n <= N; n++) {
    13             dp[n & 1][0][0] = true;
    14         }
    15         for (int n = 1; n <= N; n++) {
    16             for (int k = 1; k <= N/2; k++) {
    17                 for (int s = 1; s <= sum; s++) {
    18                     if (s >= A[n - 1]) {
    19                         dp[n & 1][k][s] = dp[n-1 & 1][k][s] || dp[n-1 & 1][k-1][s - A[n - 1]];
    20                     } else {
    21                         dp[n & 1][k][s] = dp[n-1 & 1][k][s];
    22                     }
    23                 }
    24             }
    25         }
    26         for (int k = 1; k <= N/2; k++) {
    27             if ((k * sum / N * N == k * sum) && dp[N & 1][k][k * sum / N]) return true;
    28         }
    29         return false;
    30     }
    31 int main(){
    32     int t;
    33     while(cin>>t){
    34         while(t--){
    35                 vector<int>Ve;
    36                 int n;
    37                 int num;
    38                 cin>>n;
    39                 for(int i=0;i<n;i++){
    40                     cin>>num;
    41                     Ve.push_back(num);
    42                 }
    43                 if(Average(Ve)){
    44                     cout<<"yes"<<endl;
    45                 }else{
    46                     cout<<"no"<<endl;
    47                 }
    48         }
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    linux cat 文件操作
    linux 如何显示一个文件的某几行(中间几行)
    dvm进程,linux进程,应用程序进程是否同一概念
    android-----JNI中的log打印
    push代码到github时,每次都要输入用户名和密码的问题
    linux下ndk编译命令行程序及配置
    Ubuntu16.04安装openjdk-7-jdk
    JNI——访问数组
    转:MyBatis学习总结(Mybatis总结精华文章)
    转:mybatis3中@SelectProvider的使用技巧
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/9063341.html
Copyright © 2011-2022 走看看