小米oj 幫小學生排隊(排序+插入)
阿新 • • 發佈:2018-11-01
幫小學生排隊
序號:#18難度:有挑戰時間限制:1000ms記憶體限制:10M
描述
用一個數組表示一群正在排隊的小學生,每個小學生用一對整數 H, K 來表示:H 表示這個小學生的身高,K 表示這個小學生前面應該有 K 個人的身高 >= 他。
寫一個演算法,對給出的一組小學生計算出符合描述的正確排序。
輸入
輸入為一組整數,以空格分隔:
- 第 1 個數字表示小學生的數量 n;
- 從第 2 個數字起,後續的數字兩兩一組,分別代表每個小學生的 H 和 K 的值:H_1\text{ }K_1\text{ }H_2\text{ }K_2 \cdots H_n\text{ }K_nH1 K1 H2 K2⋯Hn Kn.
輸出
根據輸入,按照題目要求對小學生進行排序,每個小學生對應的 H 和 K 值為一組,按組輸出,數字間使用空格分隔。比如H_1'\text{ }K_1'\text{ }H_2'\text{ }K_2' \cdots H_n' \text{ }K_n'H1′ K1′ H2′ K2′⋯Hn′ Kn′
輸入樣例
6 7 0 4 4 7 1 5 0 6 1 5 2
複製樣例
輸出樣例
5 0 7 0 5 2 6 1 4 4 7 1
#include<bits/stdc++.h> #include<stdio.h> #include<iostream> #include<cmath> #include<math.h> #include<queue> #include<set> #include<map> #include<iomanip> #include<algorithm> #include<stack> using namespace std; #define inf 0x3f3f3f3f typedef long long ll; int n; int id[1000]; int h[1000]; int k[1000]; bool cmp(int i,int j) { if(h[i]!=h[j])return h[i]>h[j]; else return k[i]<k[j]; } int ans[1000]; void ins(int i,int len) { int pos=k[i]; for(int j=len;j>pos;j--)ans[j]=ans[j-1]; ans[pos]=i; } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE while(cin>>n) { for(int i=0;i<n;i++)cin>>h[i]>>k[i]; for(int i=0;i<n;i++)id[i]=i; sort(id,id+n,cmp); memset(ans,-1,sizeof(ans)); for(int i=0;i<n;i++) { ins(id[i],i); } for(int i=0;i<n;i++)cout<<h[ans[i]]<<" "<<k[ans[i]]<<" "; cout<<endl; } return 0; }