贪心~

来源:互联网 发布:ubuntu音乐 编辑:程序博客网 时间:2024/04/20 08:55

例题1:TZU 1004(渊子赛马)直接见代码:

#include<iostream>#include<algorithm>using namespace std;const int MAX=1010;int n,a[MAX],b[MAX];int main(){   while(cin>>n&&n)    {   int i,j,sum,num;//sum是渊子赢得场数,num是他人赢的场数         for(i=0;i<n;i++) cin>>a[i];        for(i=0;i<n;i++) cin>>b[i];         j=sum=num=0;        sort(a,a+n);        sort(b,b+n);        for(i=0;i<n;i++)        {  if(a[i]>b[j]) sum++,j++;//若是渊子最慢的马快于别人最慢的马,那么直接赢一场            if(a[i]<=b[j]&&a[i]<b[n-j-1]) num++;//否则直接和别人最快的马相比,输一场~         }        cout<<(sum>num?"YES":"NO")<<endl;    }    return 0;}

例题2:NYOJ 218(多机调度问题),贪心算法--NP完全问题,分两种情况:

①、当n<=m时,直接输出最长的时间即可。

②、当n>m时,按照时间的长短从小到大排序(可以按从大到小排),从最大的安排起,保存在数组中,哪个最先做完就加上没有安排的工作的时间,一直枚举到所有工作都已经做完,后输出最长的时间。

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int MAX=10010;#define CLR(arr,val) memset(arr,val,sizeof(arr))int num,n,m,Time[MAX],total[MAX];int main(){   scanf("%d",&num);    while(num--)    {   CLR(total,0);        scanf("%d%d",&n,&m);        for(int i=0;i<n;i++)            scanf("%d",&Time[i]);        sort(Time,Time+n);        if(n<=m) printf("%d\n",Time[n-1]);         else        {   for(int i=n-1,j=0;i>=n-m;i--)                total[j++]=Time[i];            for(int i=n-m-1;i>=0;i--)            {   int pos=0,min=total[0];                for(int j=0;j<m;j++)                    if(total[j]<min) min=total[j],pos=j;                total[pos]+=Time[i];                }                     sort(total,total+m);            printf("%d\n",total[m-1]);        }    }    return 0;}

例题3:NYOJ 351(独木舟上的旅行),后面的讨论中聪神说这是NP问题,不懂,直接贪心,从最大的安排起即可,不知道做复杂没有,个人感觉有:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAX=310;#define CLR(arr,val) memset(arr,val,sizeof(arr))int num,maxt,n,wg[MAX],visit[MAX];int main(){   scanf("%d",&num);    while(num--)    {   CLR(visit,0);        scanf("%d%d",&maxt,&n);        for(int i=0;i<n;i++)            scanf("%d",&wg[i]);        sort(wg,wg+n);        int sum=0,total;        for(int i=n-1;i>=0;i--)            {   total=0;            if(!visit[i])            {   total+=wg[i];                visit[i]=1;                for(int j=i-1;j>=0;j--)                    if(!visit[j]&&total+wg[j]<=maxt)                    {   total+=wg[j];                        visit[j]=1;                    }                sum++;                }        }        printf("%d\n",sum);    }    return 0;}

例题4:NYOJ 287(雷达安装),和前面的喷水装置一样的题目,只是换了种方式。喷水装置的代码见这里。

#include<iostream>#include<cmath>#include<cstring>#include<vector>#include<iterator> #include<algorithm>using namespace std;const int MAX=1010;#define exp 1e-6 #define CLR(arr,val) memset(arr,val,sizeof(arr))int num,total=1,visit[MAX],sum;double D;class Point{public:    Point(){x=y=0;}    Point(int L,int R):x(y),y(R){}    friend istream& operator>>(istream &input,Point &P)     {   input>>P.x>>P.y;        return input;    }      double Dis() const     {   double dis=D*D-y*y;        if(dis>=0) return sqrt(dis);        return -1;    }       double Right() const {return x+Dis();}    double Left() const {return x-Dis();}private:    double x,y;       };struct mysort{   bool operator()(const Point &P1,const Point &P2)    {   return P1.Right()<P2.Right();    }};int main(){   Point P;    while(cin>>num>>D,num+D)    {   int sum=0;        CLR(visit,0);        bool flag=true;        vector<Point> v;        for(int i=0;i<num;i++)        {   cin>>P;            if(P.Dis()==-1) flag=false;              v.push_back(P);         }            cout<<"Case "<<total++<<": ";        if(!flag) cout<<-1<<endl;        else         {   sort(v.begin(),v.end(),mysort());            for(vector<Point>::size_type i=0;i<v.size();i++)                if(!visit[i])                {   visit[i]=1;                    sum++;                    for(vector<Point>::size_type j=i+1;j<v.size();j++)                        if(!visit[j]&&v[j].Left()-v[i].Right()<=exp)                            visit[j]=1;                  }              cout<<sum<<endl;        }    }     return 0;}


 

 

原创粉丝点击