洛谷-P1589 泥泞路

文章讨论了如何用贪心算法解决木板铺路问题,初始尝试中数组模拟方法在数据范围较大(n,L≤10000,s≤e≤10^9)时失效。通过将注意力集中在每一段泥泞路上,使用结构体和关键代码`x=max(x,a[i].l)`优化算法,解决了问题。
摘要由CSDN通过智能技术生成

题目链接:泥泞路

主要用到的算法就是:贪心算法。

一开始我的想法是,用一个数组,模拟木板所铺出的路。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
// #define int long long
#define xx first
#define yy second
pair<int, int> f[N];
int street[N];
int ans, cnt;
bool cmp(pair<int, int> p1, pair<int, int> p2)
{
    if (p1.xx == p2.xx)
        return p1.yy < p2.yy;
    return p1.xx < p2.xx;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int n, l;
    cin >> n >> l;
    for (int i = 0; i < n; i++)
        cin >> f[i].xx >> f[i].yy;
    sort(f, f + n, cmp);

    for (int i = 0; i < n; i++)
    {
        cnt = f[i].xx+1;
        while (street[f[i].yy] == 0)
        {
            if (street[cnt])
                cnt++;
            else
            {
                for (int j = 0; j < l; j++)
                {
                    street[cnt++] = 1;
                }
                ans++;
            }
        }
    }
    cout << ans << endl;
    return 0;
} 

但是这个代码有一个问题,题目的数据范围

对于 100 % 100 \% 100% 的数据, n , L ≤ 10000 n,L \leq 10000 n,L10000 s ≤ e ≤ 1 0 9 s \leq e \leq 10^9 se109

这个代码仅能够解决,,s,e在1e6以下时的情况。所以用数组模拟整个铺路的状况是不可以的(数组大小无法开到1e9)

所以这个题目,应该是针对每一段泥泞路进行处理,不能对整个路段用数组进行模拟。

#include<bits/stdc++.h>
using namespace std;
struct note{
	int l,r;
}a[10005];//定义结构体
int n,m,ans;
bool cmp(const note&aa,const note&bb){
	return aa.l<bb.l;
}//按照始端点从小到大排序
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d%d",&a[i].l,&a[i].r);
	sort(a+1,a+n+1,cmp);
	int x=0;//x表示当前的木板铺到了哪里
	for(int i=1;i<=n;i++){
		x=max(x,a[i].l);//如果x小于当前泥泞路的始端点
		while(x<a[i].r){
			x+=m;//加上木板长度
			ans++;//答案总数加1
		}
	}
	printf("%d",ans);
	return 0;
}

其中x=max(x,a[i].l),这一行代码是关键,能够时刻更新x,使用x对下一段泥泞路进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值