基于贪心的区间覆盖问题

cf 某div2 某题 很像区间覆盖 但实则十分不同 它不是线段覆盖 而是点覆盖

数据小可以用暴力标记一个数组但我感觉从中没啥意思(然而实则是懒得看暴力的代码

so 贴一下代码 很巧妙的从后贪心

#include <bits/stdc++.h>
using namespace std;

int a[1005];
int main()
{
	int n,r;
	cin>>n>>r;
	for(int i =0;i<n;i++)
		cin>>a[i];
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		int cnt=0;
		for(int j=min(i+r-1,n);j>=1&&j>=i-r+1;j--)
		{
			if(a[j]==1)
			{
				ans++;
				cnt++;
				i=j+r-1;
				break;			
			}			
		}
		if(cnt==0)
		{
			cout<<-1;	
			return 0;	
		}
		
	}	
	cout<<ans;
	
}

Besides 附加一下线段覆盖的贪心的代码,

ps .mark这个博客https://blog.csdn.net/chenguolinblog/article/details/7882316

      &https://blog.csdn.net/Dear_Jia/article/details/76548987

//此种算法貌似不适用于散点覆盖 适合线段覆盖 
#include<cstdio>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000+10;
int N, T,r,acount=0;
struct Interval
{
    int start, end;
}a[maxn];

bool cmp(const Interval &a, const Interval &b)
{
    if(a.start < b.start) return true;
    else if(a.start == b.start && a.end < b.end) return true;
    else return false;
}

void solve()
{
    sort(a, a+acount, cmp);
    /*cout<<acount<<endl;
    for(int w=0;w<acount;w++)
    {
    	cout<<a[w].start<<" "<<a[w].end<<endl;
	}*/
    int count = 0;
    int s, e = 1;
    int index = 0;
    int ok = 1;
    while(e <T)
    {
        s = e;//更新覆盖区域
        for(int i=index; i<acount; i++)
        {
            if(a[i].start <= s)
            {
                if(a[i].end >= s)e=max(a[i].end,e);//取符合条件的最远区间。 
            } 
            else
			{
                index = i;//不符合条件则需要换区间
                break;
            }
	    } 
        if(s >= e)
        {
            ok = 0;
            break;
        }
        else 
		{
			count++;
		//	cout<<count<<endl;
		}
    } 
   //cout<<count<<endl;
    
    if(ok) printf("%d\n", count);
    else printf("-1\n");
}
int main()
{
	scanf("%d%d",&N,&r);
	T=N;
	int D;
	int j=0;
	for(int i=0; i<N; i++)
    {
        scanf("%d",&D); 
		if(D==1)  
		{
			acount++;
			a[j].start=max(i-r+1,1);
	        a[j].end=min(i+r,T);
			j++;
		}
    }   
    solve();
    return 0;
	
}

猜你喜欢

转载自blog.csdn.net/DorisBao1021/article/details/83153193