/* * File: main.cpp * Author: lenovo * * Created on 2011年10月11日, 上午10:50 */ #include #include #include #include #include using namespace std; /* 题目大意是给你一个n位数,和要删除数字的个数m,要使得留下的数字最小 * 想法是用rmq找到n-m个最小的数字就行 * 需要注意的问题是不能颠倒数字的顺序 * */ char str[1010] , out[1010]; int m , dp[1010][12]; void ini(int len) /*一个模板*/ { for(int i = 0 ; i < len ; i++) dp[i][0] = i; for(int j = 1 ; 1 << j <= len ; j++) for(int i = 0 ; i+(1 << j)-1 < len ; i++) { if(str[dp[i][j-1]] <= str[dp[i+(1<<(j-1))][j-1]]) dp[i][j] = dp[i][j-1]; else dp[i][j] = dp[i+(1<<(j-1))][j-1]; } } int rmq(int x , int y) /*另外一个模板*/ { int k = log(double(y-x+1)) / log(2.0); int a1 = dp[x][k]; int a2 = dp[y-(1< 0) { pos = rmq(pos+1,len-n); /*在选择的数字后面选择 因为至少要保留n位*/ n--; out[k++] = str[pos]; /*存在out字符数组里面*/ } int i; for(i = 0 ; i < k ; i++) if(out[i] != '0') break; if(i == k) printf("0"); for(; i < k ; i++) printf("%c",out[i]); printf("\n"); } return 0; }