zoukankan      html  css  js  c++  java
  • 51nod 1103:N的倍数 抽屉原理

    题目来源: Ural 1302
    基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
     收藏
     关注
    一个长度为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

    下次再弄n个数 去模n的时候,要想到抽屉原理。

    代码:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    #include <string>
    #include <cstring>
    #pragma warning(disable:4996)
    using namespace std;
    
    long long a[50005];
    long long sum[50005];
    long long pos[50005];
    long long n;
    
    int main()
    {	
    	int i, j, flag = 0;
    	cin >> n;
    
    	memset(sum, 0, sizeof(sum));
    
    	for (i = 1; i <= n; i++)
    	{
    		cin >> a[i];
    		if (flag == 1)
    		{
    			continue;
    		}
    		else
    		{
    			sum[i] = (sum[i - 1] + a[i]) % n;
    			if (sum[i] == 0)
    			{
    				flag = 1;
    				cout << i << endl;
    				for (j = 1; j <= i; j++)
    				{
    					cout << a[j] << endl;
    				}
    				continue;
    			}
    			if (pos[sum[i]] == 0)
    			{
    				pos[sum[i]] = i;
    			}
    			else
    			{
    				flag = 1;
    				cout << i - pos[sum[i]] << endl;
    				for (j = pos[sum[i]]+1; j <= i; j++)
    				{
    					cout << a[j] << endl;
    				}
    			}
    		}
    	}
    	return 0;
    }
    



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    jquery select取值,赋值操作
    数据库性能监测工具
    Redis集群搭建与简单使用
    Docker安装指南
    yum常用操作
    centos6.8 安装Python2.7后, yum出现“No module named yum”错误
    Docker使用阿里云docker镜像加速
    高并发缓存架构
    mysql主从复制-方案1
    redis队列操作
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4899582.html
Copyright © 2011-2022 走看看