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; }
int main() { int i; for (i=1;i<20;i++) printf("%d\n",findk(i)); return 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; } } } } }
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); } } }
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; } }
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()); } }
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; }