社区讨论
求助WA了第五个点!!
P3853[TJOI2007] 路标设置参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @ltu3n77d
- 此快照首次捕获于
- 2024/03/16 21:04 2 年前
- 此快照最后确认于
- 2024/03/16 22:11 2 年前
CPP
/*
此题不可贪心!!!
#include <bits/stdc++.h>
using namespace std;
int L,n,k,ans;
int a[100010];
priority_queue <int> que;
// que.size() 元素数量
// que.push(x) 插入x
// que.pop() 删除堆顶元素
// que.top() 访问堆顶元素
// que.empty() 是否为空
// priority_queue<int,vector<int>,greater<int>> que 小顶堆
int main()
{
memset(a,0,sizeof(a));
cin>>L>>n>>k;
for (int i=1;i<=n;i++) {
scanf("%d",&a[i]);
a[i]=a[i]-a[i-1];
que.push(a[i]);
}
que.push(L-a[n]);
for (int i=1;i<=k;i++) {
int x=que.top();
if (x%2==0) {
que.pop();
que.push(x/2);
que.push(x/2);
}
else {
que.pop();
que.push(x/2);
que.push(x/2+1);
}
}
printf("%d",que.top());
return 0;
}
*/
//然而只有40分,不解
// P2678 跳石头同理
#include <bits/stdc++.h>
using namespace std;
int a[100010],b[100010];
int L,n,k;
bool ok (int x)
{
int kk=k;
for (int i=1;i<=n;i++) {
kk-=a[i]/x;
if (a[i]%x==0 && a[i]!=0) kk++;
if (kk<0) return false;
// cout<<kk<<" "<<a[i]/x<<endl;
}
if (kk>=0) return true;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>L>>n>>k;
for(int i=1;i<=n;i++) {
cin>>b[i];
a[i]=b[i]-b[i-1];
}
a[++n]=L-b[n-1];
int l=0, r=L, mid, ans=0;
while (l<=r) {
mid=(l+r)/2;
// cout<<"mid="<<mid<<" "<<l<<" "<<r<<endl;
if (mid==0) {
cout<<max(ans,1);
return 0;
}
if (ok(mid)) {
ans=mid;
r=mid-1;
}
else l=mid+1;
}
if (ans!=0) cout<<ans;
else cout<<1;
return 0;
}
/*
1000000 10 6
520 1314 5206 60918 190699 196999 520999 888888 999999 606060
*/
回复
共 0 条回复,欢迎继续交流。
正在加载回复...