其他分享
首页 > 其他分享> > Codeforces Round #715 (Div. 2)(A~C)(dp)

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

作者:互联网

题目链接

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;
}

 

标签:int,715,Codeforces,MAXN,Div,include,scanf,dp,define
来源: https://www.cnblogs.com/mikku39/p/14670539.html