算法竞赛宝典-贪心算法

故事扮演 提交于 2019-11-27 05:54:59
/*删数问题
#include <iostream>
using namespace std;
int main()
{
    string n;
    cin>>n;
    int len=n.length();
    int s;
    cin>>s;
    int i,j,k;
    for(i=1;i<=s;i++)
    {
        for(j=1;j<len;j++)
        {
            if(n[j]<n[j-1])
            {
                break;
            }
        }
        if(j<len)
        {
            len--;
            for(k=j-1;k<len;k++)
            {
                n[k]=n[k+1];
            }
        }
        else{
            len--;
        }
    }
    for(i=0;i<len;i++)
    {
        cout<<n[i];
    }
    return 0;
}*/
/*数列极差问题
#include <iostream>
#include <algorithm>
using namespace std;

#define maxn 99999999;
#define minn -1;

int main()
{
    int n;
    cin >> n;
    int a[50000 + 10],b[50000+10];
    for(int i = 0;i < n;i ++ )
    {
        cin >> a[i];
        b[i]=a[i];
    }
    int len=n;
    while(len>1)//求max
    {
        sort(a,a+n);
        a[0]=a[0]*a[1]+1;
        a[1]=maxn;
        len--;
    }
    int max1=a[0];

    int len2=n;
    while(len2>1)//求min
    {
        sort(b,b+n);
        b[n-1]=b[n-1]*b[n-2]+1;
        b[n-2]=minn;
        len2--;
    }
    int min2=b[n-1];

    cout<<max1-min2<<endl;
    return 0;
}*/
/*不相交区间问题*/
/*电视节目安排
#include <iostream>
#include <algorithm>
using namespace std;

typedef struct ds{
    int x;
    int y;
}DS;
DS T[100+10];

bool cmp(DS s1,DS s2)
{
    return s1.y<s2.y;
}

int main()
{
    int n;
    while(cin>>n)
    {
        if(n==0) break;
        for(int i=0;i<n;i++)
        {
            cin>>T[i].x>>T[i].y;
        }
        sort(T,T+n,cmp);
        int Y=T[0].y;
        int ans=1;//第一次选择x1到y1
        for(int i=1;i<n;i++)
        {
            if(T[i].x>=Y)//循环只选不相交的(开区间>=)
            {
                Y=T[i].y;
                ans++;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
*/
/*区间选点问题*/
/*监测点
#include <iostream>
#include <algorithm>
using namespace std;

typedef struct qj{
    int x;
    int y;
}QJ;
QJ a[100+10];

bool cmp(QJ s1,QJ s2)
{
    if(s1.y!=s2.y)
    {
        return s1.y<s2.y;//y从小到大排序
    }
    else{
        return s1.x>s2.x;//当y相等时x从大到小排序
    }
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>a[i].x>>a[i].y;
        }
        sort(a,a+n,cmp);
        int ans=1;//第一个点是啊a[0].y
        int Y=a[0].y;
        for(int i=1;i<n;i++)
        {
            if(a[i].x>Y)
            {
                Y=a[i].y;//更新右端点
                ans++;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
*/

/*雷达问题*/

/*广告问题*/

/*区间覆盖问题*/
/*时空定位1
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

int n,m;
double a[600+10];

bool cmp(double s1,double s2)
{
    return s1>s2;
}

int main()
{
    cin>>m;
    while(m--)
    {
        int i;
        cin>>n;
        for(i=0;i<n;i++)
        {
            cin>>a[i];
        }
        sort(a,a+n,cmp);
        double length=0;
        for(i=0;i<n;i++)
        {
            length=length+2.0*(sqrt(a[i]*a[i]-1));
            if(length>=20.0)
                break;
        }
        cout<<i+1<<endl;
    }
    return 0;
}
*/
/*时间定位2
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

struct qj1{
    int a1;
    int b1;
}a[10000+10];
struct qj2{
    double a2;
    double b2;
}b[10000+10];
bool cmp(qj2 s1,qj2 s2)
{
    return s1.a2<s2.a2;
}

int main()
{
    int N;
    cin>>N;
    while(N--)
    {
        int n,w,h;
        cin>>n>>w>>h;

        for(int i=0;i<n;i++)
        {
            cin>>a[i].a1>>a[i].b1;
        }

        int j=0;
        for(int i=0;i<n;i++)
        {
            if(a[i].b1*1.0>h/2.0)
            {
                b[j].a2=a[i].a1*1.0-sqrt(a[i].b1*a[i].b1*1.0-h*h*1.0/4.0);
                if(b[j].a2<0) b[j].a2=0;
                b[j].b2=a[i].a1*1.0+sqrt(a[i].b1*a[i].b1*1.0-h*h*1.0/4.0);
                if(b[j].b2>w) b[j].b2=w;
                j++;
            }
        }
        sort(b,b+j,cmp);

        bool flag=1;
        int ans=0,i=0;
        double maxlen=0,p=0;

        while(p<w*1.0)
        {
            maxlen=0;
            for(i;b[i].a2<=p&&i<j;i++)
            {
                if(b[i].b2-p>=maxlen)
                {
                    maxlen=b[i].b2-p;
                }
            }
            if(!maxlen)
            {
                flag=0;
                break;
            }
            p+=maxlen;
            ans++;
        }
        if(!flag)
            cout<<"0"<<endl;
        else cout<<ans<<endl;
    }
    return 0;
}
*/

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!