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

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

Posted by semonteer at 2005-11-12 14:44:50 on Problem 1023
In Reply To:为什么总是超时,谁有更简单的方法? Posted by:wxc at 2005-08-22 15:26:44
#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