贪心~
来源:互联网 发布: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;}
- 贪心!
- 贪心~
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- 贪心
- linux 内核同步自学报告
- Java学习——Java基本的程序设计结构笔记(一)
- PostgreSQL启动过程中的那些事七:初始化共享内存和信号十二:shmem中初始化SharedBackendStatus
- 西游记,插曲二,托塔天王和三太子的恩怨
- jQuery判断checkbox是否checked
- 贪心~
- JS弹出窗口的运用与技巧
- 漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析
- jsp动态动作指令
- Android学习笔记之AndroidManifest.xml文件解析
- 学数学的七个阶段
- Java数组排序总结(冒泡,选择,插入,希尔)
- 设计一个三角形类
- 指针和数组名的区别