社区讨论

求助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 条回复,欢迎继续交流。

正在加载回复...