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