我希望你是我独家记忆

一段永远封存的记忆,随风而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

URAL1032--抽屉原理

Posted on 2008-07-30 00:47 Hero 阅读(291) 评论(0)  编辑 收藏 引用 所属分类: 代码如诗--ACM

/*
ID: wangzha4
LANG: C++
TASK: URAL1032
*/

//根据抽屉原理一定有解
//remain[i]记录前i项和对inn的模
//if( 存在remain[i]==0 ) --  直接输出1~i
//else remain[i]的取值是[1~n-1]
//而remain[i]共有n个值 -- 由抽屉原理 -- 定存在i,j满足remain[i]==remain[j]

#include 
<stdio.h>
#include 
<stdlib.h>
#include 
<string.h>
#include 
<ctype.h>
#define llong unsigned long long 
#define unint unsigned int
#define printcrlf printf( "\n" )

const int inf = 1000000 ;
const int size = 10010 ;

int inn ;
int data[size] ;
int remain[size] ;
int flag[size] ;

int main()
{

#ifndef ONLINE_JUDGE
    freopen( 
"in.txt""r", stdin ) ;
    freopen( 
"out.txt","w",stdout ) ;
#endif

    
while( scanf( "%d",&inn ) != EOF )
    {
        memset( flag, 
0sizeof(flag) ) ;
        remain[
0= 0 ;
        
forint i=1; i<=inn; i++ ){
            scanf( 
"%d",&data[i] ) ;
            remain[i] 
= (remain[i-1]+data[i]) % inn ;
        }

        
forint i=1; i<=inn; i++ ){
            
if0 == remain[i] ){
                printf( 
"%d\n",i ) ;
                
forint j=1; j<=i; j++ )    printf( "%d\n",data[j] ) ;
                
break ;
            }
            
else{
                
if( flag[remain[i]] ){
                    printf( 
"%d\n",i-flag[remain[i]] ) ;
                    
forint j=flag[remain[i]]+1; j<=i; j++ )    printf( "%d\n",data[j] ) ;
                    
break ;
                }
                
else{
                    flag[remain[i]] 
= i ;
                }
            }
        }
    }
//while
    return 0 ;
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理