Codeforces Round #369

原创 2016年08月30日 15:09:30

A题

一个大水题,就是找字符串里有没有两个连续的O,如果有把OO改成++
代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n,ans;
string s[1001];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin>>s[i];
    }
    for(int i=1;i<=n;i++){
        if(s[i][0]=='O'&&s[i][1]=='O'){
            cout<<"YES"<<endl;
            s[i][0]='+';
            s[i][1]='+';
            for(int i=1;i<=n;i++){
                cout<<s[i]<<endl; 
            }
            return 0; 
        }
        if(s[i][3]=='O'&&s[i][4]=='O'){
            cout<<"YES"<<endl;
            s[i][3]='+';
            s[i][4]='+';
            for(int i=1;i<=n;i++){
                cout<<s[i]<<endl; 
            }
            return 0; 
        }
    }
    cout<<"NO";
    return 0;
} 

B题

很显然,看到这题我想到了一道大水题 神奇的幻方 就是在幻方中填一个数是横竖斜都相等。这本来是一道水题啊。。可是我最终FST掉了。。。
这是zzs神犇的代码

#include <cstdio>
#include <cmath>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <climits>

#ifdef DEBUG
#include <cassert>
#include <cstdarg>
#endif

#include <iostream>
#include <algorithm>
#include <utility>

#include <set>
#include <map>
#include <queue>
#include <stack>
#include <bitset>
#include <vector>

#include <ext/pb_ds/priority_queue.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/algorithm>
#include <ext/rope>

#define REP(i,n) for(i=0;i<(n);i++)
#define REP_B(i,n) for(i=1;i<=(n);i++)
#define CUS_REP(i,a,b) for(i=(a);i<(b);i++)
#define CUS_REP_B(i,a,b) for(i=(a);i<=(b);i++)
#define GRAPH_REP(i,u) for(i=first[u];i;i=next[i])
#ifdef DEBUG
#define PNT_DEBUG(...) fprintf(stderr,__VA_ARGS__)
#endif
const int maxn=501;
long long A[maxn][maxn];
inline bool check(int n){
    long long sum,last_sum;
    last_sum=0;
    register int i,j;
    for(i=1;i<=n;i++)
        last_sum+=A[1][i];
    for(i=2;i<=n;i++){
        sum=0;
        for(j=1;j<=n;j++)
            sum+=A[i][j];
        if(sum!=last_sum)
            return false;
        last_sum=sum;
    }
    for(i=1;i<=n;i++){
        sum=0;
        for(j=1;j<=n;j++)
            sum+=A[j][i];
        if(sum!=last_sum)
            return false;
        last_sum=sum;
    }
    sum=0;
    for(i=1;i<=n;i++){
        sum+=A[i][i];
    }
    if(sum!=last_sum)
        return false;
    sum=0;
    for(i=n;i>=1;i--)
        sum+=A[i][n-i+1];
    if(sum!=last_sum)
        return false;
    return true;
}
int main(){
    int n;
    register int i,j,a,b;
    long long t1,t2;
    scanf("%d",&n);
    REP_B(i,n){
        REP_B(j,n){
            scanf("%I64d",&A[i][j]);
            if(A[i][j]==0){
                a=i;
                b=j;
            }
        }
    }
    long long x;
    t1=0;t2=0;
    if(n==1){
        puts("1");
        return 0;
    }
    if(a==1){
        for(i=1;i<=n;i++){
            t1+=A[2][i];
            t2+=A[1][i];
        }
        x=t1-t2;
        A[a][b]=x;
        if(check(n) && x>=1){
            printf("%I64d\n",x);
        }else{
            puts("-1");
        }
    }else{
        for(i=1;i<=n;i++){
            t1+=A[a-1][i];
            t2+=A[a][i];
        }
        x=t1-t2;
        A[a][b]=x;
        if(check(n) && x>=1){
            printf("%I64d\n",x);
        }else{
            puts("-1");
        }
    }
    return 0;
}

C题

刚看我还以为要用brute force来搞,结果敲完暴力发现这是n^m的算法。。。根本过不了。。之后发现可以dp乱♂搞?于是撸了一发dp,复杂度(nm)^2,n、m的范围都有100,所以我本来没以为他能过。。神犇zzs说要用优先队列来♂搞,于是就把代码锁掉了。。。本题有一个巨坑,就是要用long long于是就来hack一下,虽说没有hack到人,但是发现房间里很多用的dp。。。有的还用了暴力通过了前测(真是exciting)不过时限是两秒,差不多能过吧到最后果然Accept了。
代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define inf 999999999999 
using namespace std;
int n,m,k,a[101];
long long ans=0;
long long cl[101][101],f[105][105][105];
int x,y;
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%I64d",&cl[i][j]);
        }
    }
    if(n==1){
        if(k==1){
            if(a[1]==0){
                long long sx=inf;
                for(int i=1;i<=m;i++){
                    sx=min(sx,cl[1][i]);
                }
                printf("%I64d",sx);
                return 0;
            }else{
                printf("0");
                return 0;
            }
        }else{
            printf("-1");
            return 0;
        }
    }
    int l=88888;
    for(int i=1;i<=n;i++){
        if(a[i]==0){
            l=i;
            break;
        }
    }
    if(l==88888){
        ans=1;
        for(int i=2;i<=n;i++){
            if(a[i]!=a[i-1])ans++;
        }
        if(ans==k){
            printf("0");
            return 0;
        } 
        printf("-1");
        return 0;
    }
    for(int i=0;i<=102;i++){
        for(int j=0;j<=102;j++){
            for(int k=0;k<=102;k++){
                f[i][j][k]=inf;
            }
        }
    }
    if(a[1]==0){
        for(int i=1;i<=m;i++){
            f[1][i][1]=cl[1][i];
        }
    }else{
        f[1][a[1]][1]=0;
    }
    for(int i=2;i<=n;i++){
        if(a[i]==0){
            for(int j=1;j<=m;j++){
                for(int k=1;k<=i;k++){
                    long long cur=inf;
                    for(int l=1;l<=m;l++){
                        if(l!=j)
                        cur=min(cur,f[i-1][l][k-1]);                 
                    }
                    f[i][j][k]=min(f[i][j][k],cur+cl[i][j]);
                    f[i][j][k]=min(f[i][j][k],f[i-1][j][k]+cl[i][j]);

                }
            }
        }else{
            for(int k=1;k<=i;k++){
                long long cur=inf;
                for(int l=1;l<=m;l++){
                        if(l!=a[i])
                        cur=min(cur,f[i-1][l][k-1]);                 
                }
                f[i][a[i]][k]=min(f[i][a[i]][k],cur);
                f[i][a[i]][k]=min(f[i][a[i]][k],f[i-1][a[i]][k]);
            }

        }
    }
    ans=inf;
    for(int i=1;i<=m;i++){
        ans=min(ans,f[n][i][k]);
    }
    if(ans==inf){
        printf("-1");
        return 0;
    } 
    printf("%I64d",ans);
    return 0;
} 
版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces Round #369 (Div. 2) -- C. Coloring Trees (三维DP)

大体题意: 给你n 个树,你要给这些树染色,  标号是0 表示这棵树还没有染色,标号不是0 表示这棵树已经染色 不需要再染,这片树的美丽程度是  连续相同颜色的数目! 告诉你指定美丽程度K,和  最多...

[Codeforces Round #369 (Div. 2)D. Directed Roads]Tarjan强连通分量+组合计数

[Codeforces Round #369 (Div. 2)D. Directed Roads]Tarjan强连通分量题目链接:[Codeforces Round #369 (Div. 2)D. D...

Codeforces Round #369 (Div. 2) 手速练习赛

一不小心打开cf发现有一场div2在20:00,感觉非常资瓷,作为一个unrated狗感觉是个很好的涨分机会,然后就去注册了。        打比赛前发现注册8000+,害怕。。。        比赛...

[Codeforces Round #369 (Div. 2) C. Coloring Trees] DP

[Codeforces Round #369 (Div. 2) C. Coloring Trees] DP题目链接:[Codeforces Round #369 (Div. 2) C. Colorin...

codeforces Round #369 (Div. 2) C. Coloring Trees (三维DP)

 C. Coloring Trees time limit per test 2 seconds memory limit per test ...

Codeforces Round #369 (Div. 2) D. Directed Roads

题目链接题意:给你一个n个点,n条有向边的图,你可以使任意条边反向,但是每条边只能反向一次,请求出使图不存在环的所有方案数量仔细思考我们发现,对于一个点数为x的环,除去全部不反向和全部反向两种情况,其...
  • naipp
  • naipp
  • 2016年08月30日 23:28
  • 118

codeforces Round#369 div2-E ZS and The Birthday Paradox

题意: 一年中有2^n天,问有k个人至少有两个人生日在同一天的概率,用分数表示。其中n,k 题解:1e6+3为素数。直接求不好求,我们可以总数-不成立的数。不成立的即为k个人中没有一个人的生日在同一...

Codeforces Round #369 (Div. 2) A. Bus to Udayland【模拟】

题意:公共汽车座位,每一排有四个座位,中间的 '|' 代表过道,'O' 代表空位置,'X' 代表有人座,问你能否找到两个连在一起的座位(中间有过道不算),如果可以的话吧相应的符号变为 '+'。 简单模...

Codeforces Round #369 (Div. 2) B. Chris and Magic Square

B. Chris and Magic Square time limit per test 2 seconds memory limit per test 256 megaby...

Codeforces Round #369 (Div. 2) D. Directed Roads (dfs+组合数学 图论)

传送门:D. Directed Roads 描述: D. Directed Roads time limit per test 2 seconds memory li...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces Round #369
举报原因:
原因补充:

(最多只允许输入30个字)