SDUT2021年全国天梯赛赛前个人专题强化赛---1(排序1)题解

53 篇文章 8 订阅
8 篇文章 0 订阅

十大排序讲解传送门

十大排序讲解链接

R7-1 魔法优惠券 (25 分)

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;

int a[N];
int b[N];
int az[N];
int bz[N];
int af[N];
int bf[N];
int za;
int zb;
int fa;
int fb;

bool cmp(int x,int y){
    return x>y;
}

int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]>0) az[++za]=a[i];
        if(a[i]<0) af[++fa]=a[i];
    }
    int m;
    cin>>m;
    for(int i=1;i<=m;i++){
        cin>>b[i];
        if(b[i]>0) bz[++zb]=b[i];
        if(b[i]<0) bf[++fb]=b[i];
    }
    sort(az+1,az+1+za,cmp);
    sort(bz+1,bz+1+zb,cmp);
    sort(af+1,af+1+fa);
    sort(bf+1,bf+1+fb);
    int i=1;
    int j=1;
    int ans=0;
    while(i<=za&&j<=zb){
        ans+=az[i++]*bz[j++];
    }
    i=j=1;
    while(i<=fa&&j<=fb){
        ans+=af[i++]*bf[j++];
    }
    cout<<ans<<endl;
    return 0;
}

R7-2 抢红包 (25 分)

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;

struct node{
    int sum;
    int tot;
    int id;
}dp[N];

bool cmp(node x,node y){
    if(x.sum>y.sum) return 1;
    if(x.sum==y.sum&&x.tot>y.tot) return 1;
    if(x.sum==y.sum&&x.tot==y.tot&&x.id<y.id) return 1;
    return 0;
}

int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        dp[i].id=i;
        int k;
        cin>>k;
        while(k--){
            int p,x;
            cin>>p>>x;
            dp[p].sum+=x;
            dp[i].sum-=x;
            dp[p].tot++;
        }
    }
    sort(dp+1,dp+1+n,cmp);
    for(int i=1;i<=n;i++){
        printf("%d %.2f\n",dp[i].id,dp[i].sum*1.0/100);
    }
    return 0;
}

R7-3 集合相似度 (25 分)

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;

set<ll>st[N];

int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int k;
        cin>>k;
        while(k--){
            int x;
            cin>>x;
            st[i].insert(x);
        }
    }
    int q;
    cin>>q;
    while(q--){
        int x,y;
        cin>>x>>y;
        int xx=st[x].size();
        int yy=st[y].size();
        int tot=0;
        for(auto it=st[x].begin();it!=st[x].end();it++){
            if(st[y].count(*it)) tot++;
        }
        printf("%.2f%%\n",tot*100.0/(xx+yy-tot));
    }
    return 0;
}

R7-4 悄悄关注 (25 分)

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;

struct node{
    string s;
    int num;
}dp[N];

set<string>st;
set<string>ans;

int main(){
    int n;
    cin>>n;
    string s;
    for(int i=1;i<=n;i++){
        cin>>s;
        st.insert(s);
    }
    int q;
    cin>>q;
    int sum=0;
    for(int i=1;i<=q;i++){
        cin>>dp[i].s>>dp[i].num;
        sum+=dp[i].num;
    }
//    cout<<sum<<endl;
    sum/=q;
//    cout<<sum<<endl;
    for(int i=1;i<=q;i++){
        if(dp[i].num>sum&&!st.count(dp[i].s)) ans.insert(dp[i].s);
    }
    if(!ans.size()) cout<<"Bing Mei You"<<endl;
    else {
        set<string>::iterator it;
        for(it=ans.begin();it!=ans.end();it++){
            cout<<(*it)<<endl;
        }
    }
    return 0;
}

R7-5 月饼 (25 分)

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;

struct node{
    double d;
    double w;
    double p;
}dp[N];

bool cmp(node x,node y){
    return x.d>y.d;
}

int main(){
    int n,d;
    cin>>n>>d;
    for(int i=1;i<=n;i++) cin>>dp[i].w;
    for(int i=1;i<=n;i++){
        cin>>dp[i].p;
        dp[i].d=dp[i].p*1.0/dp[i].w;
    }
    sort(dp+1,dp+1+n,cmp);
    double ans=0;
    for(int i=1;i<=n;i++){
        if(!d) break;
        if(dp[i].w<=d){
            d-=dp[i].w;
            ans+=dp[i].p;
        }
        else{
            ans+=dp[i].d*d;
            d=0;
            break;
        }
    }
    printf("%.2f\n",ans);
    return 0;
}

R7-6 单身狗 (25 分)

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;

set<int>st;
set<int>sp;
int mp[N];
int dp[N];

int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int x,y;
        cin>>x>>y;
        mp[x]=y;
        mp[y]=x;
    }
    int q;
    cin>>q;
    for(int i=1;i<=q;i++) cin>>dp[i],sp.insert(dp[i]);
    for(int i=1;i<=q;i++){
        if(!sp.count(mp[dp[i]])) st.insert(dp[i]);
    }
    cout<<(int)st.size()<<endl;
    set<int>::iterator it;
    for(it=st.begin();it!=st.end();it++){
        if(it==st.begin()) printf("%05d",(*it));
        else printf(" %05d",(*it));
    }
    return 0;
}

R7-7 插入排序还是堆排序 (25 分)

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
const int N = 1e3 + 10;
using namespace std;

int n;
int dp[N];
int mp[N];
int vp[N];
bool inin;

void judge_insert(int *a,int *b){
    bool flag=0;
//    cout<<n<<endl;
    for(int i=2;i<=n;i++){
//        cout<<i<<endl;
        sort(a,a+i);
        if(flag){
            inin=1;
            puts("Insertion Sort");
            cout<<a[0];
            for(int j=1;j<n;j++) cout<<" "<<a[j];
            cout<<endl;
            return ;
        }
//        cout<<a[0];
//        for(int j=1;j<n;j++) cout<<" "<<a[j];
//        cout<<endl;
        for(int j=0;j<n;j++){
            if(a[j]!=b[j]){
                flag=1;
                break;
            }
        }
        if(flag) flag=0;
        else flag=1;
    }
//    cout<<"**"<<endl;
}

void judge(int *b,int l,int r){
    int i=l;
    int j=i*2;
    while(j<=r){

//        cout<<b[0];
//        for(int i=1;i<n;i++) cout<<" "<<b[i];
//        cout<<endl;

        if(j+1<=r&&b[j]<b[j+1]) j++;
        if(b[j]>b[i]){
            swap(b[i],b[j]);
//            cout<<b[i]<<" "<<b[j]<<endl;
//            cout<<"i j::"<<i<<" "<<j<<endl;
            i=j;
            j=i*2;
        }
        else break;
    }
}


void judge_heap(int *b){
    for(int i=n;i>=1;i--) b[i]=b[i-1];
    if(inin) return ;
//    int c[N];
    puts("Heap Sort");
    int pos=n;
    while(pos>=2&&b[pos]>b[pos-1]) pos--;
    swap(b[1],b[pos]);
    judge(b,1,pos-1);
//    judge(b,0,pos-2);
//    judge(b,0,pos-2);
//    judge(b,0,pos-2);
//    swap(b[0],b[1]);
//    swap(b[2],b[5]);

    cout<<b[1];
    for(int i=2;i<=n;i++) cout<<" "<<b[i];
    cout<<endl;
}




int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>dp[i];
        vp[i]=dp[i];
    }
//    for(auto &i:dp) cout<<dp[i]<<" ";
//    cout<<endl;
    for(int i=0;i<n;i++) cin>>mp[i];
    judge_insert(dp,mp);
    judge_heap(mp);
    return 0;
}


R7-8 插入排序还是归并排序 (25 分)

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;

int n;
int dp[N];
int mp[N];
int vp[N];

void judge_insert(int *a,int *b){
    bool flag=0;
//    cout<<n<<endl;
    for(int i=2;i<=n;i++){
//        cout<<i<<endl;
        sort(a,a+i);
        if(flag){
            puts("Insertion Sort");
            cout<<a[0];
            for(int j=1;j<n;j++) cout<<" "<<a[j];
            cout<<endl;
            return ;
        }
//        cout<<a[0];
//        for(int j=1;j<n;j++) cout<<" "<<a[j];
//        cout<<endl;
        for(int j=0;j<n;j++){
            if(a[j]!=b[j]){
                flag=1;
                break;
            }
        }
        if(flag) flag=0;
        else flag=1;
    }
//    cout<<"**"<<endl;
}

void judge_merge(int *a,int *b){
    bool flag=0;
    for(int i=2;;i*=2){
        for(int j=0;j<n;j+=i)
            if(i+j<n) sort(a+j,a+j+i);
            else sort(a+j,a+n);
        if(flag){
            puts("Merge Sort");
            cout<<a[0];
            for(int j=1;j<n;j++) cout<<" "<<a[j];
            cout<<endl;
            return ;
        }
        for(int j=0;j<n;j++){
            if(a[j]!=b[j]){
                flag=1;
                break;
            }
        }
        if(flag) flag=0;
        else flag=1;
        if(i>n) break;
    }
}

int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>dp[i];
        vp[i]=dp[i];
    }
//    for(auto &i:dp) cout<<dp[i]<<" ";
//    cout<<endl;
    for(int i=0;i<n;i++) cin>>mp[i];
    judge_insert(dp,mp);
    judge_merge(vp,mp);
    return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值