TJU1042

丶灬走出姿态 提交于 2019-11-27 01:45:20
这里参考了某人很弓虽的解法。
对于数据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值可以一一对应起来。
所以,我们将两个输入数据取和以后存到两个数组里,排序后一一判断,只有当两个数组完全相同时才输出有解。否则就无解。
None.gif#include<iostream>
None.gif
using namespace std;
None.gif
None.gif
void Sort(long a[],int data);
None.gif
int main()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
long data,n,i,a[10000],b[10000],temp;
InBlock.gif    cin
>>data;
InBlock.gif    
while(data-- > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        cin
>>n;
InBlock.gif        
for(i=1,cin>>a[0];i<n;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            cin
>>temp;
InBlock.gif            a[i]
=a[i-1]+temp;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
for(i=1,cin>>b[0];i<n;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            cin
>>temp;
InBlock.gif            b[i]
=b[i-1]+temp;
ExpandedSubBlockEnd.gif        }

InBlock.gif        Sort(a,n);
InBlock.gif        Sort(b,n);
InBlock.gif        
int flag=1;
InBlock.gif        
for(i=0;i<n;i++)
InBlock.gif            
if(a[i]!=b[i])
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                flag
=0;
InBlock.gif                
break;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
if(flag) cout<<"YES"<<endl;
InBlock.gif            
else cout<<"NO"<<endl;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return 0;
ExpandedBlockEnd.gif}

None.gif
void Sort(long a[],int data)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
long temp;
InBlock.gif    
int count1,count2,min;
InBlock.gif    
for(count1=0;count1<data-1;count1++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        min
=count1;
InBlock.gif        
for(count2=count1+1;count2<data;count2++)
InBlock.gif            
if(a[min]>a[count2]) min=count2;
InBlock.gif        
if(min!=count1)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            temp
=a[count1];
InBlock.gif            a[count1]
=a[min];
InBlock.gif            a[min]
=temp;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

转载于:https://www.cnblogs.com/FancyMouse/articles/243202.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!