[codevs4906] 删数问题

来源:互联网 发布:期货套利分析软件 编辑:程序博客网 时间:2024/05/21 07:06

题目链接

题解:经典贪心,不过也可以用dp

#include<stdio.h>#include<string.h>void find(){    char N[200];    int s;    int i=0,j;    scanf("%s",N);    scanf("%d",&s);    while(s>0) /*循环减s次*/    {    i=0;/*每次删除后重头开始*/    while(i<strlen(N) && N[i]<=N[i+1])i++;/*算法核心*/    for(j=i;j<strlen(N);j++)N[j]=N[j+1];/*移位将删除的覆盖*/    s--;          }    printf("%s",N);}int main(){       find();}

dp

#include <iostream>#include <cstdio>#include <climits>#include <cstring>#include <string>using namespace std;#define INF UCHAR_MAXint n,k,x;char s[255];string f[255][255];//前i个数字保留j个数字取到的最小值void init(){    scanf("%s%d",s,&k);    n=strlen(s);k=n-k;    for(int i=1;i<=n;i++)    f[0][i]=INF;}void work(){    for(int i=1;i<=n;i++)    for(int j=1;j<=k;j++)    f[i][j]=min(f[i-1][j],f[i-1][j-1]+s[i-1]);    while(x<k-1&&f[n][k][x]=='0')//去除前导0    x++;    for(;x<k;x++)    cout<<f[n][k][x];}int main(){    init();    work();}
0 0