zoukankan      html  css  js  c++  java
  • N的倍数

    一个长度为N的数组A,从A中选出若干个数,使得这些数的和是N的倍数。
    例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8,是8的倍数。
     
    Input
    第1行:1个数N,N为数组的长度,同时也是要求的倍数。(2 <= N <= 50000)
    第2 - N + 1行:数组A的元素。(0 < A[i] <= 10^9)
    Output
    如果没有符合条件的组合,输出No Solution。
    第1行:1个数S表示你所选择的数的数量。
    第2 - S + 1行:每行1个数,对应你所选择的数。
    Input示例
    8
    2
    5
    6
    3
    18
    7
    11
    19
    Output示例
    2
    2
    6
    李陶冶 (题目提供者)
     
    C++的运行时限为:1000 ms ,空间限制为:131072 KB
    根据抽屉原理,必有答案。
    可以想象,把每个数都都mod一下n,数列中只会存在0~n-1的数。
    可以想象,这些数必然能够组成n的倍数。
    做法是弄一个前缀和,
    如果h[i]==0,输出s[1]~s[i];
    如果h[l]+h[r]==0,输出s[l+1]~s[r];
    代码实现:
     1 #include<cstdio>
     2 int n;
     3 int s[50010],h[50010];
     4 int v[50010];
     5 int main(){
     6     scanf("%d",&n);
     7     for(int i=1;i<=n;i++){
     8         scanf("%d",&s[i]);
     9         h[i]=(s[i]+h[i-1])%n;
    10         if(!h[i]){
    11             printf("%d
    ",i);
    12             for(int j=1;j<=i;j++)
    13             printf("%d
    ",s[j]);
    14             return 0;
    15         }
    16         if(v[h[i]]){
    17             printf("%d
    ",i-v[h[i]]);
    18             for(int j=v[h[i]]+1;j<=i;j++)
    19             printf("%d
    ",s[j]);
    20             return 0;
    21         }
    22         v[h[i]]=i;
    23     }
    24 }

    答案好像只要可以就行,好强的数据,好强的评测机。

    题目来源:51Nod

  • 相关阅读:
    获取文件夹下的所有子文件,读取TXT文档
    360笔试
    刷题总结
    背包问题
    二叉树的创建、层次遍历、前序遍历、中序遍历、后序遍历
    今日头条面试
    面试题目
    Java高并发秒杀优化
    配置tomcat解压版
    环境变量设置:
  • 原文地址:https://www.cnblogs.com/J-william/p/6369021.html
Copyright © 2011-2022 走看看