Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:大侠们, 帮我看看, 不会处理 k == 64, 所以用了高精, 在zoj 过了, 在poj 挂了, %I64d 的也考虑了

Posted by 2010302515 at 2012-07-05 17:42:37 on Problem 1023
In Reply To:大侠们, 帮我看看, 不会处理 k == 64, 所以用了高精, 在zoj 过了, 在poj 挂了, %I64d 的也考虑了 Posted by:semonteer at 2005-11-12 14:44:50
> #include<stdio.h>
> 
> int t,k;
> long long n;
> char bit[100];
> char N[100];
> char Max[100];
> char Diff[100];
> char Mdiff[100];
> 
> bool cmp(char *a, char *b, int k)
> {
>     if(a[k] == 0 && b[k] == 1)
>     	return true;
>     if(a[k] == 1 && b[k] == 0)
>     	return false;
>     bool flag = false;
>    	for(int i = k-1; i >= 0; i--)
>     {
>         if(a[i] == b[i])
>         	continue;
>     	if(a[i] > b[i])
>     	    flag = true;
>      	else // a[i] < b[i]
>       	    flag = false;
>         return flag && a[k] == 0 && b[k] == 0 
>              || !flag && a[k] == 1 && b[k] == 1;       
>     }     
>     return false;
> }    
> 
> void sub(char *a, char *b, char *c, int k)
> {
>     int C;
>     if(b[k] == 1)
>     {
>         C = 0;
>         for(int i = 0; i < k; i++)
>         {
>             c[i] = a[i] + b[i] + C;
>             if(c[i] > 1)
>                 c[i] -= 2, C = 1;    
>             else
>         	    C = 0;   
>         }    
>         c[k] = 0;
>     }
>     else // b[k] == 0
>     {
>         C = 0;
>         for(int i = 0; i < k; i++)
>         {
>             c[i] = 2 + a[i] - b[i] - C;
>             if(c[i] < 2)
>                 C = 1;    
>             else
>                 C = 0, c[i] -= 2; 
>         }    
>         c[k] = 0;
>     }        
> }    
> 
> int main()
> {
>     scanf("%d",&t);
>     while(t--)
>     {
>         scanf("%d",&k);
>         scanf("%s",bit);
>         scanf("%I64d",&n);
>         
>         if(n < 0)
>             N[k+1] = 1, n = -n;
>         else
>         	N[k+1] = 0;
> 
>         for(int i = 0; i < k; i++)
>         {
>             N[i] = (n&1);
>             n = (n>>1);
>         }     	 
> 
> 		Max[k] = Mdiff[k] = Max[k+1] = Mdiff[k+1] = 0;
>         for(int i = 0; i < k; i++)
>         {
>             if(bit[i] == 'p')
>             	Max[k-1-i] = 1;	
>           	else
>            		Max[k-1-i] = 0;	
>         	Mdiff[i] = 1;
>         }   
>     	
>         sub(Max, N, Diff, k+1);
>           
>         if(cmp(N,Max,k+1))
>         	printf("Impossible\n");
>     	else
>     	{
>  	       	if(cmp(Diff,Mdiff,k+1))
>  	        {
>  	            printf("Impossible\n");
>  	        }
>           	else
>            	{    
>     	    	for(int i = k-1; i >= 0; i--)
>     	    	{
>     	        	if(Diff[k-1-i] == 1)
>     	        	{
>     	            	if(bit[i] == 'p')
>     	            		bit[i] = '0';
> 	            		else
> 	            			bit[i] = '1';
>     	        	}
>     	        	else
>     	        	{
>     	            	if(bit[i] == 'p')
>     	            		bit[i] = '1';
> 	            		else
> 	            			bit[i] = '0';
> 	       		 	} 
>     	    	}
>          		printf("%s\n",bit);    
>       		}   	
>     	}
>     }   
>     return 0;
> }    

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator