首页 > 其他 > 详细

2020-05-26 — 习题训练三

时间:2020-05-30 14:11:14      阅读:36      评论:0      收藏:0      [点我收藏+]

A 题:https://vjudge.net/problem/CodeForces-1339B/origin

题意:将给的数组排序 |a1a2||a2a3||an1an|

解法:每次找一个最大值,一个最小值。

#include<iostream>
#include<cstdio>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<bitset>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;

int main(){
    int t;
    cin>>t;
    while(t--){
        int n, a[MAXN], in[MAXN], res[MAXN];
        int index=0;
        cin>>n;
        memset(res,1,sizeof(in));
        for(int i =1;i<=n;i++){
            scanf("%d",&a[i]);
       
        }         
        sort(a+1,a+n+1);
        int l=1,r=n;
        int flag=0;
        while(l<=r){
            if(flag){
                in[index++]=a[l];
                flag=0;
                l++;
            }
            else{
                in[index++]=a[r];
                flag=1;
                r--;
            }
        } 
        for(int i = index-1;i>=0;i--)
        {
            if(i!=index-1)
                cout<<" ";
            cout<<in[i];
        }
        cout<<endl;
    } 
    return 0;
}

C 题:https://vjudge.net/problem/CodeForces-1334B/origin

题意:判断是否可以每次将两个元素平均分,然后是否可以可以有k个富人。

解法:排序,从大向小判断,直到小于指定钱数。

#include<iostream>
#include<cstdio>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<bitset>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;

ll a[MAXN];
int main(){
    int t;
    cin>>t;
    while(t--){
        int n,k;
        cin>>n>>k;
        for(int i =1;i<=n;i++)
            scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        ll Sum=0,ans=0;
        for(int i =n;i>=1;i--){
            Sum+=a[i];
            if(Sum/(n-i+1)>=k){
                ans=n-i+1;
                continue;
            }            
            else
                break;    
        }
        
        cout<<ans<<endl;
    } 
    return 0;
}

D 题:https://vjudge.net/problem/CodeForces-1334C/origin

题意:当一个元素小于等于0时,爆炸会将下一个元素减去自己的爆炸伤害,为n时炸1.

解法:先求所有的血量减去前一个的爆炸伤害(小于0的为0)的和,然后枚举判断最小值。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=3e5+10;

struct book{
    ll a,b,c;
}g[MAXN];
ll tmp[MAXN];
int main(){
    int t;ll d=0;
    cin>>t;
    while(t--){
        ll n,ss=0;
        cin>>n;
        for(int i =0;i<n;i++){
            scanf("%lld",&g[i].a);
            scanf("%lld",&g[i].b);
            
            if(i!=0){
                g[i].c=max(g[i].a-g[i-1].b, d);
                ss+=g[i].c;
            }
                
        }
        g[0].c=max(g[0].a-g[n-1].b, d);
        ss+=g[0].c;
        for(int i=0;i<n;i++){
            tmp[i]=ss;
            tmp[i]-=g[i].c;
            tmp[i]+=g[i].a;
        }
        sort(tmp,tmp+n);
        cout<<tmp[0]<<endl;
    }
    return 0;
}

E 题:https://vjudge.net/problem/CodeForces-1333B/origin

题意:a数组是否可以变成b。对于变化:只能时a数组索引较小的才能加到后面的元素上。

解法:思维题,第一项一定相等,小的时候判断前面是否有1,大的时候判断前面是否有-1。

#include<iostream>
#include<cstdio>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<bitset>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;
int a[MAXN], b[MAXN], res[MAXN];
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;

        for(int i = 1;i<=n;i++){
            scanf("%d",&a[i]);
        //    cout<<a[i]<<endl;
        
        }
        int flag=1,flagf=0,flag1=0;
        for(int i = 1;i<=n;i++){
            scanf("%d",&b[i]);
                
        }
    //    cout<<"one: "<<one<<"fone: "<<fone<<"gz: "<<gz<<"dz: "<<dz<<"f1: "<<f1<<"f2: "<<f2<<endl;
        if(a[1]!=b[1]){
            cout<<"NO"<<endl;
            continue;
        }
        int tmp=1;
        for(int i=1;i<=n;i++){
            if(a[i]!=b[i]){
                if(a[i]<b[i]){
                    if(!flag1){
                        cout<<"NO"<<endl;
                        tmp=0;
                        break;
                    }
                    
                }
                else{
                    if(!flagf){
                        cout<<"NO"<<endl;
                        tmp=0;
                        break;
                    }            
                }
            }
            if(a[i]==1){
                flag1=1;
            }
                
            if(a[i]==-1){
                flagf=1;
            }
        }
        if(tmp)
            cout<<"YES"<<endl;    
    
    } 
    return 0;
}

 

2020-05-26 — 习题训练三

原文:https://www.cnblogs.com/aixiaodezsh/p/12992081.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!