排座椅
排座椅
https://ac.nowcoder.com/acm/problem/16618
算法:贪心
思路:优先选隔开说话人多的线,用pair来存每条线能需要分隔次数和位置,然后用sort按照分隔次数从大到小排序,输出即可
时间复杂度:&preview=true)
代码:
#include <bits/stdc++.h> using namespace std; const int N=2010; typedef pair<int,int> PII; PII row[N],col[N]; //first表示需要分隔次数,second表示分隔线位置 int ans[N]; bool cmp(PII x,PII y){ return x.first>y.first; } int main(){ int m,n,k,l,d,cnt; cin>>m>>n>>k>>l>>d; for (int i = 1; i <= n; i ++ ) row[i].second = i; for (int i = 1; i <= m; i ++ ) col[i].second = i; while(d--){ int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; if(x1==x2) col[min(y1,y2)].first ++; else row[min(x1,x2)].first ++; } sort(row+1,row+n+1,cmp); cnt=0; for(int i=1;i<=k;i++){ ans[cnt++]=row[i].second; } sort(ans,ans+k); for(int i=0;i<k;i++){ cout<<ans[i]<<" "; } cout<<endl; sort(col+1,col+m+1,cmp); cnt=0; for(int i=1;i<=l;i++){ ans[cnt++]=col[i].second; } sort(ans,ans+l); for(int i=0;i<l;i++){ cout<<ans[i]<<" "; } cout<<endl; return 0; }
牛客每日一题 文章被收录于专栏
水