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

Codeforces Round #715 (Div. 2)(A~C)(dp)

时间:2021-04-19 15:52:38      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:区间贪心   mem   doc   ref   get   algo   ++   str   奇数   

题目链接

A. Average Height

奇数放一侧,偶数放一侧即可。

AC代码如下:

#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
#include<cstdio>
#include<set>
#include<vector>
#define MAXN 100005
#define MOD 1000000
int t,n;
int a[2005],b[2005];
using namespace std;
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        int cnt1=0,cnt2=0;
        for(register int i=0;i<n;++i){
            int temp;
            scanf("%d",&temp);
            if(temp&1)
                a[cnt1++]=temp;
            else
                b[cnt2++]=temp;
        }
        for(register int i=0;i<cnt1;++i)
            printf("%d ",a[i]);
        for(register int i=0;i<cnt2;++i)
            printf("%d ",b[i]);
        printf("\n");
    }
    return 0;
}

B. TMT Document

首先判断t和m的个数是否分别为2k和k。

再对前k个t判断是否存在一个不同的m大于他。再对后k个t判断是否存在一个不同的m小于他。

AC代码如下:

#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
#include<cstdio>
#include<set>
#include<vector>
#define MAXN 100005
#define MOD 1000000
int t,n;
char a[MAXN];
int post[MAXN],posm[MAXN],vis[MAXN];
bool cmp (int a,int b){return a>b;}
using namespace std;
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        scanf("%s",a);
        memset(vis,0,sizeof(vis));
        int cnt1=0,cnt2=0,flag=1,tempflag=1;//前者为T,后者为M 
        for(register int i=0;i<n;++i){
            if(a[i]==T)
                post[cnt1++]=i;
            else if(a[i]==M)
                posm[cnt2++]=i;
        }
        if(cnt1!=2*cnt2)
            printf("NO\n");
        else{
            for(register int i=0;i<cnt1/2;++i){
                if(posm[i]<post[i]){
                    flag=0;
                    break;
                }
            }
            if(flag){
                for(register int i=cnt1/2;i<cnt1;++i){
                    if(posm[i-cnt1/2]>post[i]){
                        flag=0;
                        break;
                    }
                }
            }
            if(flag)
                printf("YES\n");
            else
                printf("NO\n");
        }
    }
    return 0;
}

C. The Sports Festival  (dp)

首先将s数组从小到大进行排序。

设一个区间的左端点为l,右端点为r

故对于一个区间的值为s[r]-s[l]。

对于一个区间的值的和为min(dp[l+1][r],dp[l][r-1])+s[r]-s[l]

dp求解即可。(之前一直想着贪心。即从0~n-1这个区间贪心的选择去掉最左和最右后的最小值,实际上好像不行……)

AC代码如下:

#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
#include<cstdio>
#include<set>
#include<vector>
#define MAXN 100005
#define MOD 1000000
using namespace std;
typedef long long ll;
int t,n;
ll s[2005];
ll dp[2005][2005];
int main(){
    scanf("%d",&n);
    for(register int i=0;i<n;++i){
        scanf("%lld",&s[i]);
    }
    sort(s,s+n);
    for(register int k=1;k<n;++k)
        for(register int l=0;l<n;++l){
            int r=l+k;
            if(r<n){
                dp[l][r]=min(dp[l+1][r],dp[l][r-1])+s[r]-s[l];
            }
        }
    printf("%lld\n",dp[0][n-1]);
    return 0;
}

 

Codeforces Round #715 (Div. 2)(A~C)(dp)

标签:区间贪心   mem   doc   ref   get   algo   ++   str   奇数   

原文地址:https://www.cnblogs.com/mikku39/p/14670539.html

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