培训期间做题整理(部分)

讲了很多题,把做了的分类整一下?

dp部分

1.bzoj2298

这道题有一个很神的思路。就是说把每个人成绩的范围看成一条线段,然后dp求不重叠的覆盖。记得相同的边要合并一下,记录为边的权值。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,f[100010],cnt;
struct Node
{
    int l,r;
}e[100010];
bool cmp(Node a,Node b)
{
    if(a.r==b.r)
        return a.l<b.l;
    else
        return a.r<b.r;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        if(a+b>=n)
            continue; 
        e[++cnt].l=a+1;
        e[cnt].r=n-b;
    }
    sort(e+1,e+1+cnt,cmp);
    int j=1;
    for(int i=1;i<=n;i++)
    {
        f[i]=f[i-1];
        while(e[j].r<i)
            j++;
        int tot=0;
        while(e[j].r==i)
        {
            if(e[j].l==e[j-1].l)
                tot++;
            else
                tot=1;
            f[i]=max(f[i],f[e[j].l-1]+min(i-e[j].l+1,tot));
            j++;
        }
    }
    cout<<n-f[n];
    return 0;
}
原文地址:https://www.cnblogs.com/Eternal-Glory/p/9452011.html