nyoj 504 课程设计
课程设计
时间限制:3000 ms | 内存限制:65535 KB
难度:2
- 描述
- 新学期伊始,Gangster 老师又在为如何给学生分配课程设计题目而犯愁,Gangster老师老共有 N 名学生和 M 个可选的题目,根据这些学生平时的表现,Gangster 老师精确计算出了每名学生完成各个课程设计题目所需的时间,现 Gangster 老师要给每名学生分配一个题目,使得最快完成课程设计同学所需的时间与最慢完成课程设计同学所需的时间的差最小。
- 输入
- 第一行给出正整数 T(1<=T<=10 ),表示共有 T 组测试数据,每组测试数据,首先给出两个正整数 N(0<N<=200),M( 0<M<=10),接下来给出 N 行,每行包含 M 个正整数,第 i 行的第 j 个正整数代表第 i 名同学完成第 j 个课程设计所需的时间 p ( 0<=p<=1000 )。
- 输出
- 对于每组测试数据,单行输出最小差值。
- 样例输入
-
2 3 4 2 4 5 8 6 2 1 9 4 6 8 5 2 3 1 2 3 10 12 10
- 样例输出
-
1 7
感觉可以看成是贪心的一种,参考了别人的代码,顺便解释下1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 bool vis[210]; 7 struct Node 8 { 9 int x ,y; 10 }node[2200]; 11 bool cmp(struct Node x ,struct Node y) 12 { 13 return x.x<y.x; 14 } 15 int solve(int n,int m) 16 { 17 int i,j ,temp,temp1, ans; 18 ans=999999999; 19 for(i=0;i<n;i++) 20 { 21 temp=1; 22 memset(vis,false,sizeof(vis)); 23 vis[node[i].y]=true; //每个数上都有标记 24 for(j=i;j<n;j++) 25 { 26 if(!vis[node[j].y])//如果该行还没有选 27 { 28 temp++; //选出一行 29 vis[node[j].y]=true; 30 if(temp==m) //如果正好够m个了,则拿最大的减去最小的,得到最小的 31 { 32 if((node[j].x-node[i].x)<ans) 33 { 34 ans=node[j].x-node[i].x; 35 } 36 break; 37 } 38 } 39 } 40 } 41 return ans; 42 } 43 int main() 44 { 45 int T ,n, m; 46 cin>>T; 47 while(T--) 48 { 49 cin>>n>>m; 50 int temp=0; 51 for(int i=1; i<=n; i++) 52 { 53 for(int j=0;j<m;j++) 54 { 55 cin>>node[temp].x; //对所有的进行排序 56 node[temp++].y=i; //并标记所在的行 57 } 58 } 59 sort(node,node+temp,cmp); //对所有的进行排序 60 cout<<solve(temp,n)<<endl; 61 } 62 return 0; 63 }