SGU - 296 - Sasha vs. Kate

上题目:

296. Sasha vs. Kate
Time limit per test: 1 second(s)
Memory limit: 65536 kilobytes
input: standard
output: standard




During the regular Mars's World Finals Subregional Programming Contest a boy Sasha lost N "Mars" bars of chocolate to a girl Kate. But for two years already Sasha does not hurry to pay his debt. And now Sasha and Kate decided that Sasha will give Kate P chocolate bars, where number P can be obtained from the number N by removing exactly K decimal digits. Sasha generously let Kate to choose digits to be removed. Your task is to find out how many bars Sasha will give Kate. Of course Kate will choose K digits from the number N in such a way that the resulting number P would be maximal.

Input

The first line of the input file contains two integer numbers N and K (1≤ N≤ 101000; 0≤ K≤ 999). Number K is strictly less than the number of digits in N. N will not have any leading zeros.

Output

Output the unknown P.

Example(s)
sample input
sample output
1992 2
99

 

sample input
sample output
1000 2
10

 

  题意是给你一个最多有1001的数字,然后让你剔除其中的某K个数字,求可以得到的最大的数字。

  这一题用贪心思想。

     这一题一开始读错题目,以为是挑K个数字,还以为是连续的,然后就WA了两次。后来终于看清题目了。然后就开始了各种yy,想过的思路有不少,最后列举了几个数字,找到了一点规律。

      规律是这样的:当第i个数字比后一个数字小的话,把它删掉可以比删掉其他数字的结果得到更大的结果,然后如果后面的数字等于或者小于当前的数字的话,说明当前的数字暂时可以不用删掉,然后对i+1操作。

      当然,这个规律还不完善,如果数字为32121,要求删掉2个数字的话,那当然是删掉两个1,可是刚才的思路只删除了一个1,同时如果在外面加一个循环也不能解决问题,如果序列式是32112的话就可以很好地得到正确答案,那应该怎么做呢,暂时的做法是在所有数字的结尾加一个INF,这是根据我的代码的结构(我是用栈来实现的)写出来的解决方案= =,好像有点XX(= =),AC的代码有bug= =现在改了一下。听其他同学的解法好像用了一个for和一个while就搞定了。= =

 

上代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <queue>
 4 #include <stack>
 5 #include <algorithm>
 6 #define MAX 300000+10
 7 using namespace std;
 8 
 9 
10 int s[MAX];
11 stack<int> S;
12 
13 int main()
14 {
15     //freopen("data.txt","r",stdin);
16     int i,j,n,k,e,h;
17     char c;
18     k=0;
19     memset(s,-1,sizeof(s));
20     while((c=getchar())!=' ')
21     {
22         s[k]=c-'0';
23         k++;
24     }
25     scanf("%d",&n);
26     h=n;
27     i=0;
28     //S.push(s[i]);
29     //i++;
30     while(h)
31     {
32         while(!S.empty() && s[i]>S.top())
33         {
34                 S.pop();
35                 h--;
36                 if(h==0) break;
37         }
38         if(h==0) break;
39         S.push(s[i]);
40         i++;
41         //if(s[i]==-1) break;
42     }
43     h=S.size();
44     j=0;
45     for(i--;j<h;j++,i--)
46     {
47         s[i]=S.top();
48         S.pop();
49     }
50     //e=0;
51     //for(j=0;j<h;j--) e=e*10+p[j];
52     if(i<k)
53     for(i++;i<k;i++)
54     {
55         printf("%d",s[i]);
56          //e=e*10+s[i];
57     }
58     else printf("0");
59     printf("\n");
60     return 0;
61 }
296

 

转载于:https://www.cnblogs.com/sineatos/p/3203232.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值