【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 }

 

 

 

posted @ 2012-11-07 00:18  Mr. Ant  阅读(475)  评论(0编辑  收藏  举报