贪心~

例题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;
}


 

 

你可能感兴趣的:(贪心~)