第1课 删数问题
【问题描述】
输入一个高精度的正整数n(≤240位),去掉其中任意s个数字后,剩下的数字按原左右次序组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。
【输入格式】
第1行:一个正整数n;
第2行:s (s<n的位数)。
【输出格式】
最后剩下的最小数。
【输入样例】
175438
4
【输出样例】
13
#include <bits/stdc++.h>
using namespace std;
string n;
//输入一个高精度的正整数n(≤240位)
int s;
int i;
int len1;//全局变量
string delete1(string &n,int i)
{
len1=n.size();
for(int j=i;j<n.size()-1;j++)
{
n[j]=n[j+1];
}
/*
178542
175422
4
*/
len1--;
for(int i=0;i<len1;i++)
{
cout<<n[i]<<" ";
}
cout<<endl;
//cout<<"n["<<len1-1<<"]="<<n[len1-1]<<endl;
//cout<<"len1="<<len1<<endl;
return n;//string n;
}
int main( void )
{
/*
178542
4
*/
//输入string类型的n
cin>>n;
cin>>s;
//cin>>n>>s;
len1=n.size();
while( s > 0 )
{
//找到不下降序列的位置
i=0;
while(i<len1-1 && n[i]<=n[i+1])
{
++i;
}
cout<<"i="<<i<<endl;
delete1(n,i);
--s;
cout<<"s="<<s<<endl;
}
//删除前导0
while( len1>1 && n[0]==0)
{
//delete(n,0,1);
delete1(n,0);//第0个位置
}
/*
for(int i=0;i<len1;i++)
{
cout<<n[i];
}
cout<<endl;
*/
for(int i=0;i<len1;i++)
{
cout<<n[i];
}
cout<<endl;
return 0;
}
贪心相关题目:
4.6算法之贪心(23题)
1319:【例6.1】排队接水
1320:【例6.2】均分纸牌(Noip2002)\
1321:【例6.3】删数问题(Noip1994)
1322:【例6.4】拦截导弹问题(Noip1999)
1323:【例6.5】活动选择
1324:【例6.6】整数区间
1223:An Easy Problem
1224:最大子矩阵
1225:金银岛
1226:装箱问题
1227:Ride to Office
1228:书架
1229:电池的寿命
1230:寻找平面上的极大点
1231:最小新整数
1232:Crossing River
1233:接水问题
删数问题(NOIP1994)
P1106 删数问题
删数问题 - 洛谷
NOIP2010复赛 普及组 第2题 接水问题
NOIP1999年提高组第1题 导弹拦截
https://www.cnblogs.com/huashanqingzhu/p/6728652.html
NOIP2002 提高组第1题 均分纸牌
P1031 均分纸牌
NOIP2007普及组第2题_P1094 纪念品分组
NOIP2008普及组第2题_P1056 排座椅
NOIP2012年提高组 第2题 国王游戏(贪心、排序后列出)
NOIP2013年提高组 第2题 P1966 火柴排队(逆序对、贪心、排序)
NOIP2010普及组 第4题 P1199 三国游戏(贪心)