【HDU 3183】 字符串处理
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183
题目大意:给你一串数字,要你删去n个数字,使得删去n个数字后数值最小。
解题思路:
蛋疼的水题,搞了我一天。开始是暴力模拟,各种测试对但就是过不了。所以换了个写法。
思路主要是这样的: 因为需要你删除m个数使得结果最小,所以每次对字符串进行一次遍历,从前往后,只要a[i]>a[j] (j的位置为i后面未标记的第一个) 则对a[i]进行一次标记(赋赋值)将其除外,进行n次遍历,这样就删除了n个数字。因为删除的都是和后面比较相比下大的,所得结果当然就最小了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 int main() 8 { 9 int n, i, j, k; 10 char f[1024]; 11 int a[1024]; 12 while(scanf("%s%d",f,&n)!=EOF) 13 { 14 int len=strlen(f); 15 memset(a,0,sizeof(a)); 16 for(i=0; i<len; i++) 17 a[i]=f[i]-'0'; 18 for(i=0; i<n; i++) 19 for(j=0; j<len; j++) 20 { 21 if(a[j]>0) 22 { 23 for(k=j+1; k<len; k++) 24 { 25 if(a[k]>=0) break; 26 } 27 if(a[j]>a[k]) 28 { 29 a[j]=-1; 30 break; 31 } 32 } 33 } 34 int flag=0; 35 for(i=0; i<len; i++) 36 { 37 if(a[i]<0||(!flag&&a[i]==0)) 38 { 39 continue; 40 } 41 else 42 { 43 flag=1; 44 printf("%d",a[i]); 45 } 46 } 47 if(!flag) 48 cout << 0; 49 cout << endl; 50 } 51 return 0; 52 }