Fancy Mouse
- -|||
这里参考了某人很弓虽的解法。
对于数据a1,a2,a3,...,an。考虑sigma(i=1~j,ai)(j=1~n)这n个数
当a(k-1),ak,a(k+1)变换一次成为a`(k-1)=ak+a(k+1),a`k=-ak,a`(k+1)=ak+a(k+1)以后,
sigma(i=1~k-1,a`i) = sigma(i=1~k-2,ai) + a`k = sigma(i=1~k,a`i)
sigma(i=1~k,a`i) = sigma(i=1~k-1,a`i) + a`k = sigma(i=1~k-1,a`i)
sigma(i=1~k+1,a`i) = sigma(i=1~k,a`i) + a`k = sigma(i=1~k+1,a`i)
可以发现新的sigma(ai)数列中,仅仅是sigma(i=1~k-1,ai)和sigma(i=1~k,ai)换了一个位置。
于是我们也就知道,如果能够用有限次交换从一个状态达到另一个状态,两个状态的sigma值可以一一对应起来。
所以,我们将两个输入数据取和以后存到两个数组里,排序后一一判断,只有当两个数组完全相同时才输出有解。否则就无解。
#include<iostream>
using namespace std;

void Sort(long a[],int data);
int main()
{
    
long data,n,i,a[10000],b[10000],temp;
    cin
>>data;
    
while(data-- > 0)
    
{
        cin
>>n;
        
for(i=1,cin>>a[0];i<n;i++)
        
{
            cin
>>temp;
            a[i]
=a[i-1]+temp;
        }

        
for(i=1,cin>>b[0];i<n;i++)
        
{
            cin
>>temp;
            b[i]
=b[i-1]+temp;
        }

        Sort(a,n);
        Sort(b,n);
        
int flag=1;
        
for(i=0;i<n;i++)
            
if(a[i]!=b[i])
            
{
                flag
=0;
                
break;
            }

            
if(flag) cout<<"YES"<<endl;
            
else cout<<"NO"<<endl;
    }

    
return 0;
}

void Sort(long a[],int data)
{
    
long temp;
    
int count1,count2,min;
    
for(count1=0;count1<data-1;count1++)
    
{
        min
=count1;
        
for(count2=count1+1;count2<data;count2++)
            
if(a[min]>a[count2]) min=count2;
        
if(min!=count1)
        
{
            temp
=a[count1];
            a[count1]
=a[min];
            a[min]
=temp;
        }

    }

}
posted on 2005-09-24 12:58  Fancy Mouse  阅读(242)  评论(1编辑  收藏  举报