码迷,mamicode.com
首页 > 其他好文 > 详细

Educational Codeforces Round 69 (Rated for Div. 2)

时间:2019-07-23 10:05:42      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:bsp   opened   思路   sum   include   flag   +=   using   name   

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)

标签:bsp   opened   思路   sum   include   flag   +=   using   name   

原文地址:https://www.cnblogs.com/lin1874/p/11229539.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!