洛谷_P1106 删数问题(尚贤)

【题目传送门】

洛谷 P1106 删数问题
此题与 1231 最小新整数 基本雷同
1231 最小新整数
感觉题目比较简单,将最大的数由大到小删除
样例通过,但提交,未通过
总觉得算法不对,因为删的是最大的数,但又举不出反例
http://blog.csdn.net/c20190102/article/details/52350828此文介绍得真不赖,摘抄如下:
此题先看看思路:
如果是直接删掉最大的数字,很容易便可举出反例:
1529 1
如果直接删最大的9,结果为152,如果删掉5,结果为129,显然删掉5才是最佳答案。
再看一组数据:
141519 2
如果删最大的9,5,结果为1411,如果删掉4,5,结果为1119,显然删掉4,5才是最佳答案。
发现什么了吗?
先看第一组:
1 5 1 9
小大 小 大
留删 留 留
第二组:
1 4 1 5 1 9
小 大 小 大 小 大
留 删 留删 留 留
删掉的是“山峰”,也就是比后一个数大的数,且越靠前“山
"峰”越早删。
大体思路也就一句话:删除靠前的“山峰”。
另外,有几个坑不得不提:
1.注意删除前导0(虽然它说每个数位都不为0,但是测试数据里面好像有这样的数据)。
2.删过一个数记得长度len–。
3.有多组数据(其实数组可以不清零,因为有len控制查找范围)。
4.当把数删为0(见数据4)时,要输出0。
另外送大家几组数据(我就在此栽过跟头):
输入 输出
13420 2 120
1444 3 1
20018 2 1
10000 1 0
http://blog.csdn.net/qq_25734657/article/details/52329863代码简练,此文也写得不错,摘抄如下:
1243865 1怎么删呢?如果你认为是删8,那就错了。如果删8,得124365,但如果删4,得123865,哪个更小呢?毫无疑问是后者吧。那如果是1244444 5呢?最后删到124就删不掉了,所以还有一个条件,如果删了一遍,删不掉,就删去最后一个。大概意思就是这样,由于这道题没有出现有0的情况,所以我在这里暂时不讨论,可以自己想想。
代码彻底推翻重来,样例通过,提交,未通过,
少了break,修改,提交AC 2017-11-2 22:26
提交,测试点2,6答案错误
提供两组测试数据
输入:
20018 2
输出:
1
输入:
10000 1
输出:
0
针对上述两组输入输出数据进行修改,提交AC 2017-11-26 17:13

#include <cstdio>
#include <cstring>
#define SIZE 250 + 10
using namespace std;
char str[SIZE];
bool vis[SIZE];

void f1(int &);
int f2(const int &);

int main() {
	freopen("cpp.in", "r", stdin);
	freopen("cpp.out", "w", stdout);
	int k;
	scanf("%s%d", &str, &k);
	strcat(str, "0000");
	f1(k);
	int len = strlen(str) - 4;
	bool ok = true;
	int i = 0;
	while (str[i] == '0' || vis[i]) {
		++i;
	}
	for (; i < len; ++i) {
		if (!vis[i]) {
			printf("%c", str[i]);
			ok = false;
		}
	}
	if (ok) {
		printf("0");
	}
	return 0;
}

void f1(int &k) {
	int len = strlen(str) - 4;
	while (k--) {
		for (int i = 0; i < len; ++i) {
			if (!vis[i]) {
				int j = f2(i);
				if (str[i] > str[j]) {
					vis[i] = true;
					break;
				}
			}
		}
	}
}
int f2(const int &n) {
	int m = n + 1;
	while (vis[m]) {
		++m;
	}
	return m;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用:时间限制: 1000 ms 内存限制: 65536 KB 提交数: 32908 通过数: 19042 【题目描述】 输出一个整数序列中最大的数和最小的数的差。 引用[2]:【输入样例】 5 2 5 7 4 2 【输出样例】 5 //信息学奥赛一本通1112:最大值和最小值的差 视频题解 #include<bits/stdc .h> using namespace std; //微信14808098 一起快乐学习信息学奥赛 //更多视频题解点击 blog.csdn.net/weixin_42790071 //更多视频题解 百度搜索:清远尚贤博客 int a[10005]; int max_=-20000; int min_=20000; int n; int main() { cin>>n; for(int i=1;i<=n;i ){ scanf("%d",&a[i]); if(a[i]>max_){ max_ = a[i]; } if(a[i]<min_){ min_ = a[i]; } } printf("%d",max_-min_); return 0; }。 引用:书名:《Java Web开发实战1200例(第II卷)》(清华大学出版社.卢瀚.王春斌) PDF格式扫描版,全书分为7篇23章,共960页。2011年6月出版。 注:原书只有前20章818页,本人添加了剩余章节重编辑成完整版本,为了方便... 根据题目描述,需要输出一个整数序列中最大的数和最小的数的差。根据给定的输入样例,我们有一个整数序列为[2, 5, 7, 4, 2]。我们需要找到最大的数和最小的数,然后计算它们的差。在给出的代码中,有一个for循环用于遍历整数序列,并使用max_和min_变量来保存最大和最小的数。最后,通过计算max_-min_得到最大和最小的差并输出结果。因此,对于给定的输入样例,最大值和最小值的差为5。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [信息学奥赛一本通1112:最大值和最小值的差 视频题解](https://blog.csdn.net/weixin_42790071/article/details/112261065)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Java Web开发实战1200例(第2卷)(完整版).(清华出版.卢瀚.王春斌).part3](https://download.csdn.net/download/pczlang/9548438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值