【6.18校內test】T2分數線劃定

分數線劃定【題目連接】node

這道題也不是什麼難題,思路一帶而過吧:ios

SOLUTION:c++

First.輸入n,m,計算m*1.5的值,接着輸入編號和成績,而後個人作法是在輸入編號成績以後,開一個101大小的數組來記錄某個分數段的人數(由於分數是0~100因此纔敢這麼幹qwq大了就慫了)。數組

Second.使用最簡單好用的sort進行排序,按照成績從高到低排,若是成績相同,編號小的在前面。ide

Third.進行分數線劃定,這裏喜歡用while(不會用for寫這個的說),首先咱們先選擇恰爲計劃錄取人數的150%(下取整)的人數,而後要注意的是每選擇一我的就把這我的所表明的分數的d數組--;spa

而後計算到第m我的時,若是第m我的所對應的d數組不爲0,那麼說明還有相同分數的沒有被選上,所以用當前記錄到的cnt+=d[p[cnt].s];code

Last.輸出(這個沒必要多說)blog


自我感受今天考場上寫的代碼比洛谷上交的思路要好(至少思路清晰)排序

附代碼:get

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>

using namespace std;

int n,m,cnt;
int d[101];
struct node {
    int k,s;
}p[5010];

bool cmp(node x,node y){
    if(x.s==y.s) return x.k<y.k;
    return x.s>y.s;
}

int main(){
    scanf("%d %d",&n,&m);
    m*=1.5;
    for(int i=1;i<=n;i++)
     scanf("%d %d",&p[i].k,&p[i].s),d[p[i].s]++;
    sort(p+1,p+n+1,cmp);
    while(cnt<=m){
        if(cnt==m) break;
        cnt++;
        d[p[cnt].s]--;
    }
    if(d[p[cnt].s]!=0) cnt+=d[p[cnt].s];
    cout<<p[cnt].s<<" "<<cnt<<endl;
    for(int i=1;i<=cnt;i++)
      cout<<p[i].k<<" "<<p[i].s<<endl;
    return 0;
} 
#include<bits/stdc++.h>

using namespace std;

int n,m,cnt[101],ans,sor,r;
struct node{
    int k,s;
}p[5010];

bool cmp(node x,node y){
    if(x.s==y.s) return x.k<y.k;
    return x.s>y.s;
}

int main(){
    scanf("%d %d",&n,&m);
    int jh=m*1.5;
    for(int i=1;i<=n;i++)
      scanf("%d %d",&p[i].k,&p[i].s),cnt[p[i].s]++;
    sort(p+1,p+n+1,cmp);
    for(int i=1;i<=n;i++){
        if(ans+1>jh) break;
        if(p[i-1].s==p[i].s) r++;
        if(p[i-1].s!=p[i].s) r=1;
        
        ans++;
        sor=p[i].s;
    }
    if(cnt[sor]!=r) ans+=(cnt[sor]-r);
    cout<<sor<<" "<<ans<<endl;
    for(int i=1;i<=ans;i++)
      cout<<p[i].k<<" "<<p[i].s<<endl;
}
Luogu Code

end-

相關文章
相關標籤/搜索