社区讨论

错误贪心+二分,样例一个没过贪到70分遗憾离场

P14635[NOIP2025] 糖果店参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mizws5fa
此快照首次捕获于
2025/12/10 19:11
2 个月前
此快照最后确认于
2025/12/13 09:45
2 个月前
查看原帖
刚入坑两个月的小白,只能做到这里了:(
再学习几个月回来把他切了:)
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

// 很遗憾这是一个错误的贪心,只能70/100分
// 对于样例1
// a[0] 的糖果奇数价和偶数价都是3
// 所以它永远保持在最前面,价格也不变
// 程序会一直买这个糖果,直到钱不够为止,最终能买 3 次糖果

struct candy{
	int odd;//奇数
	int even;//偶数
	int now;//当前价格
} a[100000];

LL m;
int n;
LL cnt;

bool cmp(candy a,candy b)
{
	return a.now < b.now;
}

void solve()
{
	sort(a, a + n,cmp);
	int tmp = 0;
	do{
		tmp = a[0].now;
		m -= tmp;
		cnt++;
        if(tmp == a[0].even)
        {
			a[0].now = a[0].odd;
		}
        else
        {
			a[0].now = a[0].even;
		}
		int L = 1; // 从1开始,因为a[0]是要插入的元素
		int R = n - 1;
		int ans = 0;
		while(L <= R)//进行二分确定更新后的a[0]该放在哪
        {
			int mid = (L + R) / 2;
            if(a[mid].now >= a[0].now)
            {
				R = mid - 1;
			}
			else{
				L = mid + 1;
				ans = mid + 1; 
			}
		}
		candy temp = a[0];
		for (int i = 0; i < ans; i++)
        {
			a[i] = a[i + 1];
		}
		a[ans] = temp;
	} while (m >= 0);
    if(m<0)//最后一次买糖如果钱不够了那就减掉
    {
		cnt--;
	}
	printf("%lld", cnt);
}

int main()
{
	scanf("%d %lld",&n,&m);
	for (int i = 0; i < n;i++)
    {
		scanf("%d %d", &a[i].odd, &a[i].even);
		a[i].now = a[i].odd;
	}
	solve();
	// system("pause");
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...