Delete Numbers(0700)
来源:互联网 发布:数据可视化算法 编辑:程序博客网 时间:2024/05/16 16:58
原题目连接点此处
给定n 位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a(n<100) 和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案。 对于给定的正整数a,编程计算删去k个数字后得到的最小数。
Description
第1 行是1 个正整数a。第2 行是正整数k。
Input
计算出的最小数(输出无前导0)
Output
178543
Sample Input
13
Sample Output
Hint
mryang
题目数据小,直接暴力就可以。
一开始想的太简单了。直接按最大的数开始删,直到删除前k大的数。提交一发,WA。各种数据测试,正常。最后才发现按那样的思路 506 1 就过不了
它会先删除6,得到50,显然先删除5得到06,6要比50小;所以。。。。这就是坑。。。。。
那就不按从大到小,按从前到后,反正只要删除的不是当前最小就好。
假设有这么一组数据xyzzzz;开始比较x,y如果x比y大,那么yzzzz < xzzzz所以删掉x;如果x < y;就一定删掉y吗?不一定。假如y < z;删掉y就是xzzzz,那xzzzz和xyzzz比,前面x一样百位y < z所以不应该删掉y;而应该删掉z;
综上,只要前面一个数大于后面一个,就删除前面一个数;
代码如下:
#include <stdio.h> #include <string.h>char s[105];void del(int n)//删除第n个数{ int i; for(i=n;i<strlen(s)-1;i++) { s[i]=s[i+1]; } s[i]='\0';}int main(){ int n,i,j; while(~scanf("%s",s)) { scanf("%d",&n); if(n>=strlen(s)) { printf("0\n"); continue; } for(i=0;i<n;i++) { int max=-1; int pos; for(j=0;j<strlen(s)-1;j++) { if(s[j]>s[j+1])//只要前面一个数大于后面一个,就跳出循环 { pos=j; break; } } del(pos); } for(i=0;s[i]=='0';i++);//跳过前缀0 if(i==strlen(s)) printf("0"); else for(;i<strlen(s);i++) { printf("%c",s[i]); } printf("\n"); } return 0;}
0 0
- Delete Numbers(0700)
- 700 Delete Numbers
- swustoj---700Delete Numbers
- 0700.Delete Numbers
- Delete numbers in a string
- 圈人数数:An interesting way to delete numbers
- swustojDelete Numbers(0700)
- DELETE
- delete
- delete
- DELETE
- delete
- delete
- delete
- Delete
- delete []
- delete
- Delete
- 句法分析树标注集
- Apache Kafka 教程笔记
- Android之菜单总结
- 一点想法
- eclipse 配置JDK
- Delete Numbers(0700)
- Linux有名管道(FIFO)的阻塞和非阻塞读写
- Swift - 函数 & 闭包的应用实例
- LNMP安装
- Mac升级到EI capitan重新设置Apache和php
- caffe: 使用draw_net.py画出MNIST Lenet的网络图
- linux下如何编写makefile文件
- 蓝桥杯--算法训练 未名湖边的烦恼 (递归)
- Android SQLite学习指南