Educational Codeforces Round 69 (Rated for Div. 2)

Posted lin1874

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 69 (Rated for Div. 2)相关的知识,希望对你有一定的参考价值。

A. DIY Wooden Ladder

题意:搭梯子,选两条最长的边为基础边,然后选择其他边当台阶,并且台阶数小于基础边;

技术图片
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int main()

        ios::sync_with_stdio(false);
        int T;
        cin>>T;
        while(T--)
                int n;
                cin>>n;
                int a[maxn];
                for(int i=0;i<n;i++)
                        cin>>a[i];
                
                sort(a,a+n);
                int flag=a[n-2]-1;
                if(n-2>=flag)
                        cout<<flag<<endl;
                
                else cout<<n-2<<endl;
        
        return 0;
View Code

B. Pillars

题意:n个位置,每个位置一个半径为ai的碟子,移动碟子,判断能否全部叠在一起,移动的条件满足:位置i->j,abs(i-j)==1,i要有碟子,j要么没有,要么就半径要大于i;

思路:记录最大半径的位置,最大半径的位置一定不会移动,然后向两边找比最大半径小的,(特殊是半径不会相同,并且是1-n)

技术图片
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
int main()

        ios::sync_with_stdio(false);
        int a[maxn];
        int n;
        cin>>n;
        int flag;
        for(int i=1;i<=n;i++)
                cin>>a[i];
                if(a[i]==n)
                        flag=i;
                
        
        int cnt=n-1,l=flag-1,r=flag+1;
        while(cnt>0)
                if(l>0&&a[l]==cnt)
                
                        l--;
                        cnt--;
                
                else if(r<=n&&a[r]==cnt)
                
                        r++;
                        cnt--;
                
                else
                
                        cnt=-2;
                        break;
                
                //cout<<"l="<<l<<"r="<<r<<"cnt"<<cnt<<endl;
        
        if(cnt==-2)
                cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
        return 0;
View Code

C. Array Splitting

题意:给n个数,并且已经按递增排序,要分成k个子集,计算所有子集最大值和最小值的差和,使得这个和最小;

思路:当子集为1个数的时候,这个的差为0,所以在n个数分成k份时,k-1个为1个数的子集时,n-k个不为1个数的子集时最小,计算数组中两两差值,排序,答案就是前n-k个最小值和;

技术图片
#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+100;
int main()

        ios::sync_with_stdio(false);
        int a[maxn];
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=n;i++)
                cin>>a[i];
        
        int b[maxn];
        for(int i=1;i<n;i++)
                b[i]=a[i+1]-a[i];
        
        sort(b+1,b+n);
        int sum=0;
        for(int i=1;i<=n-k;i++)
        
                sum+=b[i];
        
        cout<<sum<<endl;
View Code

 

以上是关于Educational Codeforces Round 69 (Rated for Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章

Educational Codeforces Round 7 A

Educational Codeforces Round 7

Educational Codeforces Round 90

Educational Codeforces Round 33

Codeforces Educational Codeforces Round 54 题解

Educational Codeforces Round 27