现在的位置: 首页 > 综合 > 正文

poj 2356 &&poj 3370(开挂) 抽屉原理(鸽巢原理)同nyoj 636世界末日

2018年04月25日 ⁄ 综合 ⁄ 共 1895字 ⁄ 字号 评论关闭

poj 2356  http://poj.org/problem?id=2356

import java.util.Scanner;
public class Main {
	//抽屉原理(鸽巢原理)最基础的原理便是n+1的物体放到n个盒子里,至少有一个盒子放了两个物体
	//有n个数,从中选出几个数的和是n的倍数。
    //结论是任意的n个数,必然能找到连续的m个数之和是n的倍数。
    //组合数学书中,黑书都有介绍。Sk表示a1+a2+……ak,如果Sk是n的倍数,那就直接取Sk了,否则S1-Sn除n的余数分布在1---(n-1)这n-1个数中,运用鸽巢原理,必然有两个的余数相同,即(Si%n)=(Sj%n),即(Sj-Si)%n=0,证毕
	static int record[];
	static void print(int start,int end)
	{
		System.out.println(end-start+1);
		for(int i=start;i<=end;i++)
		{
			System.out.println(record[i]);
		}
	}
	public static void main(String[] args) {
	 Scanner scanner=new Scanner(System.in);
	 while(scanner.hasNext())
	 {
		 int n=scanner.nextInt();
		 record=new int[n+1];
		 int sum[]=new int[n+1];
		 int flag[]=new int[n+1];
		 for(int i=1;i<=n;i++)
		 {
			 record[i]=scanner.nextInt();
			 sum[i]=(sum[i-1]+record[i])%n;
		 }
		 for(int i=1;i<=n;i++)
		 {
			 if(sum[i]==0)
			 {
				 print(1, i);
				 break;
			 }
			 else if(flag[sum[i]]!=0){
				print(flag[sum[i]]+1, i);
				break;
			}
			 else {
				flag[sum[i]]=i;
			}
		 }
	 }
	}
}

 

poj  3370   http://poj.org/problem?id=3370   开挂可过

import java.io.BufferedInputStream;
import java.io.IOException;
public class Main {
	//抽屉原理(鸽巢原理)最基础的原理便是n+1的物体放到n个盒子里,至少有一个盒子放了两个物体
	//有n个数,从中选出几个数的和是n的倍数。
    //结论是任意的n个数,必然能找到连续的m个数之和是n的倍数。
    //组合数学书中,黑书都有介绍。Sk表示a1+a2+……ak,如果Sk是n的倍数,那就直接取Sk了,否则S1-Sn除n的余数分布在1---(n-1)这n-1个数中,运用鸽巢原理,必然有两个的余数相同,即(Si%n)=(Sj%n),即(Sj-Si)%n=0,证毕
	
	public static BufferedInputStream bis = new BufferedInputStream(System.in);
	public static int read() throws IOException {
		int i;
		while ((i = bis.read()) < 48)
			if (i == -1)
				return -1;
		int temp = 0;
		while (i > 47) {
			temp = temp * 10 + i - 48;
			i = bis.read();
		}
		return temp;
	}
	static void print(int start,int end)
	{
		for(int i=start;i<end;i++)
		{
			System.out.print(i+" ");
		}
		System.out.println(end);
	}
	public static void main(String[] args) throws IOException {
	 while(true)
	 {
		 int m=read();int n=read();
		 if(n==0&&m==0)break;
		 int record[]=new int[n+1];
	     int sum[]=new int[n+1];
	     int flag[]=new int[n+1];
		 for(int i=1;i<=n;i++)
		 {
			 record[i]=read();
			 
		 }
		 for(int i=1;i<=n;i++)
		 {
			 sum[i]=(sum[i-1]+record[i])%m;
			 if(sum[i]==0)
			 {
				 print(1, i);
				 break;
			 }
			if(flag[sum[i]]!=0){
				print(flag[sum[i]]+1, i);
				break;
			}
			flag[sum[i]]=i;
		 }
	 }
	}
}

 

抱歉!评论已关闭.