ZCMU-1139: 松哥的困惑V && ZCMU-1143:又是比智力(贪心)

1139: 松哥的困惑V

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 425  Solved: 129
[Submit][Status][Web Board]

Description

松哥上了数学课之后,觉得自己智力实在有所不足,所以他决定找人辩论,以提高自己的智力,已知松哥目前的智力是m,他决定和n个人辩论,如果他对手的智力高于他,松哥的智力能够提升2,否则只能提升1,假设松哥能够取得所有的胜利,请问他完成n场辩论后能够得到的最高智力是多少?

Input

多组测试数据.

每组测试数据的第一行包含两个正整数m,n.(m<=100,n<=10^5)

第二行为n个不大于100的整数,代表与他辩论人的智力.

Output

对于每组测试数据,他完成n场辩论后,能取得的最大的智力.

Sample Input

91 5

88 90 92 94 98

Sample Output

99

HINT

Source

 

 

1143: 又是比智力

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 1578  Solved: 291
[Submit][Status][Web Board]

Description

松哥上了数学课之后,觉得自己智力实在有所不足,所以他决定找人辩论,以提高自己的智力,已知松哥目前的智力是m,他决定和n个人辩论,如果他对手的智力低于他,松哥的智力能够提升2,否则只能提升1,假设松哥能够取得所有的胜利,请问他完成n场辩论后能够得到的最高智力是多少?

Input

多组测试数据.

每组测试数据的第一行包含两个正整数m,n.(m<=100,n<=10^5)

第二行为n个不大于100的整数,代表与他辩论人的智力.

Output

对于每组测试数据,他完成n场辩论后,能取得的最大的智力.

Sample Input

91 5

88 90 92 94 98

Sample Output

101

HINT

【解析】

一开始我以为两题一样的,一看输出不对劲(之前已经A过1143了,所以有印象)。

仔细一看就能发现一个是对手高于他,m+2,第二题是对手低于他,m+2。这就很有意思了,一个字只差做法完全不一样。

我还能说什么,编程真有意思。

 

先说第一题吧,因为对手高于他才能得分,那么输入进去的低分记住个数(num_low)就行了,答案里记得加上,

就OKK。智力比他高的,需要存数组里。然后很自然的排序(为了智力提升最大化),高的+2,不高于的+1;

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int main()
{
	int m, n, a[N];
	while (~scanf("%d%d", &m, &n))
	{
		int t,num_low = 0, len_high = 0;
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &t);
			if (t <= m)//低智力直接记个数
				num_low++;
			else	   //高智力存入数组
			{
				a[len_high] = t;
				len_high++;
			}
		}
		sort(a, a + len_high);//排序
		int score_fail = 0;
		for (int i = 0; i < len_high; i++)
		{
			if (m < a[i])m += 2;
			else
				score_fail++;//不能直接m++因为这样会影响下一次循环。你就想反正得不到2
							 //那到最后再得1好了,直接+1可能会让你下一次得不到2
		}
		printf("%d\n", m + num_low + score_fail);
	}
	return 0;
}

第二题:

这个想的到就简单一点,想不通就一直WA下去吧。

有点类似田忌赛马,我要是比不过你,那我就去找最厉害的人比,反正都是输,先输给厉害的人,

说不定下次就能比你高1。

 

#include <bits/stdc++.h>
using namespace std;
int main()
{
	std::ios::sync_with_stdio(false);
	int n, m, nn[100100];
	while (cin >> m >> n)
	{
		memset(nn, 0, sizeof(nn));
		for (int i = 0; i < n; i++)cin >> nn[i];
		sort(nn, nn + n);
		for (int i = 0; i < n; i++)
		{
			if (nn[i] < m)m += 2;
			else//要点,比不过当前的,那就去跟智力最高的一个比,即n--,i--
			{
				n--;
				i--;
				m++;
			}
		}
		cout << m << endl;
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值