
参加了虚拟比赛11道只做了5道。。SB阿。。
346和353都是模拟的题目。。懒得做了。。
347。。看代码吧。。
Code。。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=100+10;
string A[maxn];
bool cmp(const string&A,const string&B)
{
return (A+B)<(B+A);
}
int main()
{
int N;cin>>N;
for(int i=0;i<N;i++)
cin>>A[i];
sort(A,A+N,cmp);
for(int i=0;i<N;i++)
cout<<A[i];
cout<<endl;
}
350。。
有点意思的题目。。
首先如果有一个解。。那么把这些数全部xor上一个数的话。。还是一个解。。
因为(a xor x) xor (b xor x)=(a xor b) xor (x xor x)= a xor b xor 0= a xor b。。。
所以就当里面有一个0好了。。
然后特判掉M=1的情况。。
那么注意到。。如果B中有两个数A和B。。A xor B=另一个数C。。
那么A和B必然有公共的元素。。
那么就很简单了。。找两个有公共元素的B中的数i,j。。强行将它们的公共元素设为0。。
那么现在就有3个数了0,i,j。。
那么只要找其他的有0的元素就可以求出一个解了。。怎么求找呢?
如果B中数x不是i xor j。。又跟i和j都有公共元素。。那么这个公共元素只能是0了。。那么这个数就属于解了。。。
就这样找数。。。
#include<iostream>
#define REP(i,n) for(int i=0;i<n;i++)
using namespace std;
const int maxn=100;
int M,B[maxn];
bool HaveCommon(int i,int j,int&k)
{
int now=B[i]^B[j];
for(k=0;k<M;k++)
if(B[k]==now)
return true;
return false;
}
int main()
{
cin>>M;
REP(i,M) cin>>B[i];
if(M==1)
{
cout<<(B[0]-1)<<" "<<(B[0]^(B[0]-1))<<endl;
return 0;
}
int ans[maxn];ans[0]=0;int i,j,k;
bool mark[maxn]={0};
for(i=0;i<M;i++)
for(j=i+1;j<M;j++)
if(HaveCommon(i,j,k))
{
ans[1]=B[i],ans[2]=B[j],mark[i]=mark[j]=mark[k]=true;
goto out;
}
out:
int cnt=3,t;
for(int o=0;o<M;o++) if(!mark[o])
if(HaveCommon(o,i,t)&&HaveCommon(o,j,t))
ans[cnt++]=B[o];
cout<<ans[0];
for(int i=1;i<cnt;i++)
cout<<" "<<ans[i];
cout<<endl;
}355。。。
构造题。。很明显答案是logN+1…
染色的话只要染成素因数个数就OK了。。
#include<iostream>
using namespace std;
int num(int p)
{
int cnt=0;
while(p%2==0)
{cnt++;p/=2;}
while(p%3==0)
{cnt++;p/=3;}
for(int i=5,j=25,k=4;j<=p;i+=(k=6-k),j+=(i*2-k)*k)
{
while(p%i==0)
{cnt++;p/=i;}
}
if(p!=1)
cnt+=2;
else
cnt+=1;
return cnt;
}
int main()
{
int N,x,cnt=0;cin>>N;x=1;
while(x<=N){cnt++;x*=2;}
cout<<cnt<<endl;
for(int i=1;i<N;i++)
cout<<num(i)<<" ";
cout<<num(N)<<endl;
}