删数问题(NOI94)

输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序
组成一个新的正整数。
编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。
输出新的正整数。(N不超过240位)输入数据均不需判错。
【输入】
n
s
【输出】
最后剩下的最小数。
【样例输入】
175438
4
【样例输出】
13

分析:

由于正整数n的有效数位为240位,所以很自然地采用字符串类型存贮n。

那么如何决定哪s位被删除呢?是不是最大的s个数字呢?显然不是,大家很容易举出一些反例。

为了尽可能逼近目标,我们选取的贪心策略为:每一步总是选择一个使剩下的数最小的数字删去,

即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字;否则删除第一个递减区间的首字符,

这样删一位便形成了一个新数字串。然后回到串首,按上述规则再删下一个数字。重复以上过程s次为止,

剩下的数字串便是问题的解了。

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     freopen("delete.in","r",stdin);
 6     freopen("delete.out","w",stdout);
 7     char N[250];
 8     int s;
 9     int i,j,len,k,f;
10     scanf("%s",N);
11     scanf("%d",&s);
12     //printf("%s\n%d\n",N,s);
13     len=strlen(N);
14     for(i=0;i<s;i++)  //共需要删除s次
15     {
16         for(j=0;j<len-1;j++) //从串首开始搜索
17         {
18             if(N[j]>N[j+1])  //假如发现非下降区间
19             {
20                 for(k=j;k<len-1;k++) //把N[j+1]~N[len-1]个往前移动一个位置
21                     N[k]=N[k+1];
22                 break;
23             }
24         }
25         len--;  //长度减1
26     }
27
28     f=0;
29     for(i=0;i<len;i++)  //消除串首无意义的字符0
30     {
31         if(N[i]!=‘0‘)    f=1;
32         if(f==1) printf("%c",N[i]);
33     }
34     printf("\n");
35     return 0;
36 }
时间: 2024-10-11 17:34:22

删数问题(NOI94)的相关文章

codevs4096 删数问题

题目描述 Description 键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N 和S,寻找一种方案使得剩下的数字组成的新数最小. 输入数据均不需要判错. 输出组成的新的正整数.(N不超过240位) 输入描述 Input Description 第一行,输入一正整数N(N<=10240),表示要删的数: 第二行,输入一正整数S,表示删去的个数,当然S小于N的位数. 输出描述 Output Description 仅一行,输出删数后形

洛谷P1106 删数问题

题目描述 键盘输入一个高精度的正整数N,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小. 输出应包括所去掉的数字的位置和组成的新的整数.(N不超过250位) 输入数据均不需判错. 输入输出格式 输入格式: n (高精度的正整数) k (需要删除的数字个数) 输出格式: 最后剩下的最小数. 输入输出样例 输入样例#1: 175438 4 输出样例#1: 13分析:贪心思想,我们每次删数肯定是要找前面的大数给删掉,并且这

4906 删数问题

4906 删数问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N 和S,寻找一种方案使得剩下的数字组成的新数最小. 输入数据均不需要判错. 输出组成的新的正整数.(N不超过240位) 输入描述 Input Description 第一行,输入一正整数N(N<=10240),表示要删的数: 第二行,

1106 删数问题

1106 删数问题 难度:普及/提高- 题目类型:贪心 提交次数:3 涉及知识:字符串.贪心 题目描述 键盘输入一个高精度的正整数N,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小. 输出应包括所去掉的数字的位置和组成的新的正整数.(N不超过250位) 输入数据均不需判错. 代码: #include<iostream> #include<cstring> using namespace std; int

删数问题--贪心

删数问题 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定n 位(n≤100)正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数.对于给定的n 位正整数a和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案. 对于给定的正整数a,计算删去k 个数字后得到的最小数. 输入 输入数据的第1 行是1 个正整数a.第2 行是正整数k. 输出 将计算出的最小数输出. 示例输入 178543 4

算法课作业之删数问题

问题描述: 通过键盘输入一个高精度的正整数n(n的有效位数≤240),去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数.编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小. 问题分析: 这个问题是最优子结构问题,即局部最优能决定全局最优解,可以使用贪心算法进行解决.n个正整数去掉s个数字,求使得到的新的正整数最大的删除方案可以等价为:对于n个正整数组成的数字,一个一个地依次去掉s个数字,要求每删除一个数时,都使删除后的新的正整数最小.因此问题转化为求解删除一个数字时

【贪心】删数问题

[贪心]删数问题 题目描述 输入一个高精度的正整数n(≤240位),去掉其中任意s个数字后,剩下的数字按原左右次序组成一个新的正整数.编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小. 输入 第1行:一个正整数n: 第2行:s(s<n的位数). 输出 最后剩下的最小数. 样例输入 175438 4 样例输出 13分析:结论是删去第一个递减的数,如果没有则删去最后一个数:代码: #include <iostream> #include <cstdio> #incl

[来源不详]删数方案数

Description 给出一个正整数序列 a,长度为 n,cyb 不喜欢完美,他要删掉一些数(也可以不删,即删掉0个),但是他不会乱删,他希望删去以后,能将 a 分成 2 个集合,使得两个非空集合的数的和相同,现在他希望你能帮他算出删数的方案数. Input 第一行 n 个正整数 以下有 n行,每行1个 正整数表示整数序列a Output 一个整数表示答案 Sample Input 4 1 2 3 4 Sample Output 3 Hint 30%:n<=5 100%:n<=20 100%

解题报告—— 2018级2016第二学期第五周作业 删数问题

解题报告--  2018级2016第二学期第五周作业 删数问题 描述 键盘输入一个高精度的正整数n(<=240位),去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小. 输入ns输出最后剩下的最小数样例输入 178543 4 样例输出 13 分析: 这题题目上已表明是贪心算法:原本最容易产生的错误贪心准则是删去其中最大的数字:但通过简单举例便可得之,这种贪心准则要漏洞:通过简单的计算举例发现如果这个数是一位比一位大的话

删数问题

删数问题 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 72   Accepted Submission(s) : 16 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 键盘输入一个高精度的正整数n(≤240位),去掉其中任意s个数字