社区讨论
错误贪心+二分,样例一个没过贪到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 条回复,欢迎继续交流。
正在加载回复...