double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
    int nums=nums1.size()+nums2.size();
    if(nums&0x01)
        return findk(nums1,nums2,(nums+1)/2);
    else
        return (findk(nums1,nums2,(nums+1)/2)+findk(nums1,nums2,(nums+2)/2))/2;
 }
Exemple #2
0
int main() {
	int i;

	for (i=1;i<20;i++)
		printf("%d\n",findk(i));
	
	return 0;
}
Exemple #3
0
void findk(int k[14], int pos)
{
	if ( pos == 14 )
	{
		if ( !hates[k[13]][k[0]] && !hates[k[0]][k[13]] &&
			 ( !hasneed[k[13]] || needok[k[13]] || needs[k[13]][k[0]] ) &&
			 ( !hasneed[k[0]] || needs[k[0]][k[13]] || needs[k[0]][k[1]] ) )
		{
			char buf[15];
			buf[14] = 0;
			for ( int i = 0; i < 14; i++ )
				buf[i] = k[i] + 'a';
			outs.insert(std::string(buf));
		}
	}
	else
	{
		for ( int i = 0; i < 14; i++ )
		{
			if ( was[i] || hates[k[pos-1]][i] || hates[i][k[pos-1]] ||
				 ( hasneed[k[pos-1]] && !needok[k[pos-1]] && !needs[k[pos-1]][i] ) )
				continue;
			else
			{
				if ( hasneed[i] )
				{
					needok[i] = needs[i][k[pos-1]] ? 1 : 0;
					was[i] = 1;
					k[pos] = i;
					findk(k, pos+1);
					needok[i] = 0;
					was[i] = 0;
				}
				else
				{
					needok[i] = 1;
					was[i] = 1;
					k[pos] = i;
					findk(k, pos+1);
					was[i] = 0;
				}
			}
		}
	}
}
Exemple #4
0
SPTNode *findk(SPTNode *T,int k){
	if(T){
		int n;			//N为当前节点为第几大
		if(T->lchild){
			n = T->nc - T->lchild->nc;
		}else if(T->rchild){
			n = T->rchild->nc + 2;
		}else{
			n = 1;
		}

		if(n == k){
			return T;
		}else if(n > k){
			return findk(T->rchild,k);
		}else{
			return findk(T->lchild,k-n);
		}
	}
}
Exemple #5
0
int diff()
{
  // opt[0]=0
  int i;
  int lastcmd=-1; // -1: init, 0: add, 1: opt1 is copy
  
  // when considering opt[i], we know opt[0]..opt[i-1]. 
  // opt[i-1] is the overhead constructing bytes [0,...,i-2]
  // opt[i]   is the overhead constructing bytes [0,...,i-1]
  for (i=1; i<=nsize; i++) {
  	int rm=0;
  	int k = findk(i-1, &rm);
	
	ss0[i] = ss1[i] = i-1;
	
	if (lastcmd == -1) {
	  ss0[i] = ss1[i] = 0; // no last cmd actually
	  opt0[i] = alpha+1;
	  cmds0[i].type = 0; cmds0[i].length = 1; cmds0[i].inew = i-1;
	  if(dbgflag)printf("%d|%d: cmd0: type=%d, length=%d, opt0=%d,k=%d,s0=%d\n",lastcmd,i,cmds0[i].type, cmds0[i].inew,cmds0[i].length,opt0[i],ss0[i],s0[i]);
	  if (k>i-1) { // cannot copy
		opt1[i] = opt0[i];
		cmds1[i].type = 0; cmds1[i].length = 1; cmds1[i].inew = i-1;
		if(dbgflag)printf("%d|%d: cmd1: type=%d, length=%d, opt1=%d,k=%d,s0=%d\n",lastcmd,i,cmds1[i].type, cmds1[i].length,opt1[i],ss1[i],s0[i]);
	    lastcmd=0;
	  } else { // can copy
		opt1[i] = beta;
		cmds1[i].type = 1; cmds1[i].length = i-k; cmds1[i].inew = k; cmds1[i].iold = rm;
		ss1[i]=k;
		if(dbgflag)printf("%d|%d: cmd1: type=%d, length=%d, opt1=%d,k=%d,s0=%d\n",lastcmd,i,cmds1[i].type, cmds1[i].length,opt1[i],ss1[i],s0[i]);
	    lastcmd=1;
	  }
	}
	else if (lastcmd == 0) {
	  // the last byte can only be added
      s0[i] = s1[i] = 0; 
	  opt0[i] = opt0[i-1]+1;
	  cmds0[i].type = 0; cmds0[i].length = 1; cmds0[i].inew = i-1;
		if(dbgflag)printf("%d|%d: cmd0: type=%d, length=%d, opt0=%d,k=%d,s0=%d\n",lastcmd,i,cmds0[i].type, cmds0[i].length,opt0[i],ss0[i],s0[i]);
	  if (k>i-1) { // cannot copy
		opt1[i] = opt0[i];
		cmds1[i].type = 0; cmds1[i].length = 1; cmds1[i].inew = i-1;
		if(dbgflag)printf("%d|%d: cmd1: type=%d, length=%d, opt1=%d,k=%d,s0=%d\n",lastcmd,i,cmds1[i].type, cmds1[i].length,opt1[i],ss1[i],s0[i]);
		lastcmd=0;
	  } else { // can copy
		opt1[i] = opt0[i-1]+beta;
		cmds1[i].type = 1; cmds1[i].length = i-k; cmds1[i].inew = k; cmds1[i].iold = rm;
		ss1[i]=k;
		if(dbgflag)printf("%d|%d: cmd1: type=%d, length=%d, opt1=%d,k=%d,s0=%d\n",lastcmd,i,cmds1[i].type, cmds1[i].length,opt1[i],ss1[i],s0[i]);
		lastcmd=1;
	  }
	}
	else if (lastcmd == 1) {
	  // add,add vs copy,add
	  int addadd  = opt0[i-1]+1;
	  int copyadd = opt1[i-1]+alpha+1;
	  if (copyadd <= addadd) {
	    opt0[i] = copyadd;
		s0[i] = 1;
	  } else {
	    opt0[i] = addadd;
		s0[i] = 0;
	  }
	  cmds0[i].type = 0; cmds0[i].length = 1; cmds0[i].inew = i-1;
	  
		if(dbgflag)printf("%d|%d: cmd0: type=%d, length=%d, opt0=%d,k=%d,s0=%d\n",lastcmd,i,cmds0[i].type, cmds0[i].length,opt0[i],ss0[i],s0[i]);
	  if (k>i-1) { // cannot copy: add
		opt1[i] = opt0[i];
		s1[i] = s0[i];
		cmds1[i].type = 0; cmds1[i].length = 1; cmds1[i].inew = i-1;
		if(dbgflag)printf("%d|%d: cmd1: type=%d, length=%d, opt1=%d,k=%d,s1=%d\n",lastcmd,i,cmds1[i].type, cmds1[i].length,opt1[i],ss1[i],s1[i]);
		lastcmd=0;
	  } else { // can copy: choose last add or last copy?
		int addcopy = opt0[i-1]+beta;
		int copycopy;
		
		if (k==cmds1[i-1].inew) {
		  // The same segment
		  copycopy = opt1[i-1];
		  s1[i] =1;

		} 

		else{
			if (k<1) {
				 printf("error k\n");
				exit(1);
			}
			if (opt1[k]<=opt0[k]) {
				 copycopy = opt1[k]+beta; 
				 s1[k+1] = 1;
				 s1[i] = 1;
			} else {
				 copycopy = opt0[k]+beta; // 有可能也是addcopy
				 s1[k+1] = 0;
				 s1[i] = 0;
			}
		}
  	    if (copycopy <= addcopy) {
			opt1[i] = copycopy;
			ss1[i]=k;
		} 
		else {
			opt1[i] = addcopy;
			ss1[i] = i-1;
		}
		cmds1[i].type = 1; cmds1[i].length = i-k; cmds1[i].inew = k; cmds1[i].iold = rm;

		if(dbgflag)printf("%d|%d: cmd1: type=%d, length=%d, opt1=%d,k=%d, optk=%d,s1=%d\n",lastcmd,i,cmds1[i].type, cmds1[i].length,opt1[i],ss1[i],opt1[k],s1[i]);
		lastcmd=1;
	  }
	}
  }
  if (opt0[nsize]<opt1[nsize]) {
	dsize = opt0[nsize];
	dmmap = (unsigned char*)malloc(dsize);
	return 0;
  } else {
	dsize = opt1[nsize];
	dmmap = (unsigned char*)malloc(dsize);
	return 1;
  }
}
Exemple #6
0
int main( int argc, char *argv[] )
{
#ifdef _DEBUG
	atexit(waitChar);
#endif

	if ( argc != 2 ) {
		printf("Need file parameter\n");
		return -1;
	}

	char buf[128];

	strcpy(buf, argv[1]);
	strcat(buf, ".in");
	FILE *inFile = fopen(buf, "rb");
	if ( !inFile ) {
		printf("Cant open input file \'%s\'\n", buf);
		return -1;
	}

	int i, ruleNum, knight;
	size_t len, pos;

	memset(needs, 0, 196);
	memset(hasneed, 0, 14);
	fscanf(inFile, "%d %d\n", &i, &ruleNum);
	for ( i = 0; i < ruleNum; i++ )
	{
		fgets(buf, 128, inFile);
		len = strlen(buf);
		knight = buf[0] - 'a';
		// hates
		if ( buf[2] == 'h' ) {
			for ( pos = 8; pos < len; pos += 6 ) {
				hates[knight][buf[pos] - 'a'] = 1;
			}
		}
		// needs
		else {
			hasneed[knight] = 1;
			for ( pos = 8; pos < len; pos += 5 ) {
				needs[knight][buf[pos] - 'a'] = 1;
			}
		}
	}

	fclose(inFile);

	int k[14];

	// make the main stuff
	memset(k, 0, 14);
	memset(needok, 0, 14);
	for ( i = 0; i < 14; i++ )
	{
		k[0] = i;
		was[i] = 1;
		needok[i] = 1;
		findk(k, 1);
		was[i] = 0;
		needok[i] = 0;
	}

	// write out
	strcpy(buf, argv[1]);
	strcat(buf, ".out");
	FILE *outFile = fopen(buf, "wb");
	if ( !outFile ) {
		printf("Cant open output file \'%s\'\n", buf);
		return -1;
	}
	for ( std::set<std::string>::iterator it = outs.begin(); it != outs.end(); it++ ) {
		fprintf(outFile, "%s\n", it->c_str());
	}
}    
Exemple #7
0
struct deci_tree* infoGainRecursive(int Z[500][500],int b[50][50],struct deci_tree * parent,double entr,int max1,int attr,int obj,int flag,int initattr,int a[500][500]){

    int i =0 ;
    int j;
    int modifiedA[500][500],modifiedB[50][50];
    double col3[50],col1[50],entr1[50],entropy1[50][50],gain1[50];
    int dim[2];
    if(flag == 1){
        flag = 0;
        parent->ent = entr;   
        parent->data = 0;
        for(i = 0 ; i  < attr ;i++){
            for(j = 0 ; j <  obj;j++){
                modifiedA[j][i] = Z[j][i];
            }
        }             
        findk(modifiedA,modifiedB,obj,attr);

    
    }
    
    else{

          for(i = 0 ; i  < attr ;i++){

            for(j = 0 ; j <  obj;j++){
                modifiedA[j][i] = Z[j][i];

            }
        }

        funcModiA(modifiedA,modifiedA,max1,attr,obj,parent->pos,dim);
        obj = dim[0];
        attr = dim[1];
        parent->ent = entropy(modifiedA,obj,attr,i,modifiedB[i][j],NULL);
        if(parent->ent == 0 ){
             int sd =  parent->data ;
             parent->data = modifiedA[1][attr-1];
             parent->datasetCol = attr-1;
             parent->childno = 0;        
             printf("\n\tnode %d is terminated with row value %d ,  child of %d i posotion value %d\n",parent->data , parent->pos ,sd,parent->ivalue);
             return 0;
        }
        else{
            findk(modifiedA,modifiedB,obj,attr);         
        }    
    }

    for(i= 0; i < attr-1 ; i++){
        for(j= 1 ; j <= modifiedB[i][0]; j++){    
            col3[j-1] = entropy(modifiedA,obj,attr,i,modifiedB[i][j],NULL);
        
        }
        entr1[i] =  findsum(col3,modifiedB[i][0]);
        gain1[i] =  parent->ent  - entr1[i];
    }

    int temp = max1;
    max1 = findmax(gain1,attr-1);
    parent->data = modifiedA[0][max1];
    parent->childno = modifiedB[max1][0];

    for(i = 0; i <= initattr;i++){
        if(parent->data    == a[0][i]){
            parent->datasetCol = i; 
            break;
        }    
    }

    printf("\n\tCurrent node is %d and is child of %d , through  row value %d,i position %d coloum number %d \n", parent->data,Z[0][temp],parent->pos,parent->ivalue,parent->datasetCol);
    
    for(i = 1; i <= modifiedB[max1][0] ;i++) {
        parent->c[i] = (struct deci_tree *)malloc(sizeof(struct deci_tree ));    
        parent->c[i]->pos = modifiedB[max1][i];           
        parent->c[i]->data = modifiedA[0][max1];
        parent->c[i]->ent = parent->ent;
        parent->c[i]->ivalue = i;
        infoGainRecursive(modifiedA,modifiedB,parent->c[i],parent->c[i]->ent,max1,attr,obj,flag,initattr,a);
    }

    return parent;
}