编程之美复赛A题小数据解法 (二)

2014-11-24 02:46:53 · 作者: · 浏览: 6
if(line[j] != "2")
{
t1 = line[j];
break;
}
}
line[p] = getstr(t1,t2);
}
int sum = 0,sum1 = 0;
for(int i = 0 ; i <= n+1 ; i++)
{
int size = line[i].size();
sum += size;
for(int j = 0 ; j < size; j++)
{
if(line[i][j] == '1')
sum1++;
}
}
cout<<"Case #"< }
return 0;
}

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
//typedef long long LL;
//typedef __int64 LL;
//typedef long double DB;
//typedef unisigned __int64 LL;
//typedef unsigned long long ULL;
#define EPS 1e-8
#define MAXN 10005
#define MAXE 300000
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define MOD 99991
//#define MOD 99990001
//#define MOD 1000000007
#define max(a,b) ((a)>(b) (a):(b))
#define min(a,b) ((a)<(b) (a):(b))
#define max3(a,b,c) (max(max(a,b),c))
#define min3(a,b,c) (min(min(a,b),c))
#define mabs(a) ((a<0) (-a):a)
//#define L(t) (t << 1) //Left son t*2
//#define R(t) (t << 1 | 1) //Right son t*2+1
//#define Mid(a,b) ((a+b)>>1) //Get Mid
//#define lowbit(a) (a&-a) //Get Lowbit
//int gcd(int a,int b){return b gcd(b,a%b):a;}
//int lcm(int a,int b){return a*b/gcd(a,b);}
//std::ios::sync_with_stdio(false);
struct node
{
int loc;
int now;
}x[50005];
string line[50005];
int cmp(node a, node b){
return a.loc < b.loc;
}
int cmp2(node a,node b ){
return a.now < b.now;
}
string getstr(string t,string v)
{
string a = t;
string b = v;
int lena = a.size();
int lenb = b.size();

int len = max(lena,lenb);
string c;
bool flag = false;
for(int i = 0 ; i < len ; i++)
{
if(a[i] != '0' && a[i] != '1')
a += "0";
if(b[i] != '1' && b[i] != '0')
b += "0";
}
for(int i = 0 ; i < len ; i++)
{
if(a[i] == b[i])
c = c + a[i];
else
{
if( (c + "1") != v)
{
c = c +"1";
return c;
}else if( (c + "1") == v)
{
c = c + "0";
while(c + "1" <= t)
c = c + "1";
c = c + "1";
return c;
}
}
}
}
int main()
{
int T;
cin>>T;
for(int t = 1 ; t <= T ;t++)
{
int n;
cin>>n;
line[0] = "0";
line[n+1] = "1";
for(int i = 1 ; i <= n ; i++)
line[i] = "2";
for(int i = 0 ; i < n ; i++)
{
scanf("%d",&x[i].loc);
x[i].now = i+1;
}
sort(x,x+n,cmp);
for(int i = 0 ; i < n ; i++)
x[i].loc = i+1;
sort(x,x+n,cmp2);
for(int i = 0 ; i < n ; i++)
{
string t1,t2;
int p = x[i].loc;
for(int j = p+1 ; j <= n+1 ; j++)
{
if(line[j] != "2")
{
t2 = line[j];
break;
}
}
for(int j = p-1 ; j >= 0 ; j--)
{
if(line[j] != "2")
{
t1 = line[j];
break;
}
}
line[p] = getstr(t1,t2);
}
int sum = 0,sum1 = 0;
for(int i = 0 ; i <= n+1 ; i++)
{
int size = line[i].size();
sum += size;
for(int j = 0 ; j < size; j++)
{
if(line[i][j] == '1')
sum1++;
}
}
cout<<"Case #"< }
ret