1 solutions
-
1
P1056 排座椅
思路很简单,记录所有有关数据并排序 具体见代码
#include<bits/stdc++.h> using namespace std; struct z{int li/*行列数据(存储编号小的)*/;int s/*能隔开多少对*/;}a[2005]/*横行*/,b[2005]/*纵列*/;//设定一个结构体,表示一条通道的数据 bool cmp1(z a,z b){return a.s>b.s;} bool cmp2(z a,z b){return a.li<b.li;}//cmp1和cmp2两个函数后面有用处 int m,n,k,l,d;//题目要求 int main(){ cin>>m>>n>>k>>l>>d;//输入 for(int i=0;i<2000;i++){ a[i].li=b[i].li=i; a[i].s=b[i].s=0; }//初始化 for(int i=0;i<d;i++){ int x,y,p,q; cin>>x>>y>>p>>q;//不用再开数组,直接局部变量 if(x==p) b[min(y,q)].s++;//如果他们在同一行,那么就在两列之间开通道,通道隔开的人数(即价值)就++ else a[min(x,p)].s++;//反之亦然 } sort(a,a+m,cmp1);sort(a,a+k,cmp2);//先筛出价值最高的k条通道,再根据列数大小排序(这里就要用到cmp1,2两个函数) sort(b,b+n,cmp1);sort(b,b+l,cmp2);//b数组同理 for(int i=0;i<k;i++)cout<<a[i].li<<' ';//输出 cout<<'\n'; for(int i=0;i<l;i++)cout<<b[i].li<<' '; return /*164*/0; }
16401314
- 1
Information
- ID
- 56
- Time
- 1000ms
- Memory
- 125MiB
- Difficulty
- 3
- Tags
- # Submissions
- 17
- Accepted
- 7
- Uploaded By