题目链接:Click here~~
题意:
神一样的题意。第一遍读题完全没搞懂要干啥。
其实就是给一串数字,删除k位后,不改变原顺序,要求留下的数字最小。
解题思路:
假设原数字的长度为l,即我们需要保留 l-k 位。
由感性认识,我们知道当高位数字越小时,所得结果越小。
依据这个思路,我们采用最简单的方法,以从高位向低位的顺序,一位一位的来选择保留哪位。
对于选择每一位的时候,由于不能改变数字的原顺序,所以我们要考虑选择的范围,即要为后面的数字留下足够的位数。
比如第一次选择的时候,我们需要给后面留下 l-k-1 个位置,如果设最后的数字下标是 l-1 ,则我们只能选择区间 [0,k] 中的元素。
选择完后,我们还要记录它的位置q,因为在下一次选择的时候,我们要从上次选择的数字后面开始,即[q+1,k+1]中的元素。
一般化以后,可以先初始化q为-1,则选择的区间每次都是[q+1,k+i]。( i 表示现在选择的是第几位,最高位是0)
#include <stdio.h>
#include <string.h>
int main()
{
int k,l,min;
char s[10005],ans[10005];
while(~scanf("%s%d",s,&k))
{
l = strlen(s);
for(int i=0,q=-1;i<l-k;i++)
{
min = '9'+1;
for(int j=q+1;j<=k+i;j++)
{
if(min > s[j])
min = s[j] , q = j;
}
ans[i] = min;
}
ans[l-k] = '\0';
puts(ans);
}
return 0;
}
同理,我们可以知道使留下的数字最大的解法。
#include <stdio.h>
#include <string.h>
int main()
{
int k,l,max;
char s[10005],ans[10005];
while(~scanf("%s%d",s,&k))
{
l = strlen(s);
for(int i=0,q=-1;i<l-k;i++)
{
max = 0;
for(int j=q+1;j<=k+i;j++)
if(max < s[j])
max = s[j] , q = j;
ans[i] = max;
}
ans[l-k] = '\0';
puts(ans);
}
return 0;
}
分享到:
相关推荐
NBUT 2020 MADE I Boat Design writer:zzzcd0x 思路 根据板材长度以及合理的长宽比等因素设定A和B的范围 第一步是粗筛,即枚举A的范围内每一个长度为0.6的区间的中点,计算中点位置的A、B、H对应的船体底面方程的...
1001 1002 1003 1004 1005 1006 1007 1008 1011 1012 1013 1014 1015 1017 1018 1019 1028 1032 1042 1046 1050 1061 1065 1066 1067 1077 1080 1083 1088 1094 1111 1125 1135 1141 1157 1160 1161 1163 1166 1170 ...
此回购包含OJ Hunt的源代码 简体中文版: 建造状态 产品特点 查询oj的ac / submissions 存储查询历史 正在开发中 电子邮件支持 等级 …… ...搜寻器:搜寻器来查询OJ。...crawler-api-backend:提供查询api的微服务 ...
N久之前的一个坑——用 Node.js 来重构 NBUT 的 Online Judge,包括评测端也得重构一遍。(至于什么时候完成大家就不要关心了,(/‵Д′)/~ ╧╧ 总之我们现在要做的其实简而言之就是——用C/C++来实现 Node.js ...
Face_recognition_NBUT 项目简介: 本项目是基于宁波工程学院机器人学院的MADE2人脸识别项目 人脸识别采取PCA降维算法 本项目最后的aff_faces人脸集的识别正确率在96%左右 作者才疏学浅,如有错误请不吝指正 项目...