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) D. Directed Roads (dfs+组合数学 图论)

传送门:D. Directed Roads 描述: D. Directed Roads time limit per test 2 seconds memory li...
  • guhaiteng
  • guhaiteng
  • 2016年08月30日 19:06
  • 374

Educational Codeforces Round 27

A 题意:把2 * n个人分成两组,使得无论两组的人怎么进行比赛 第一组的人始终都要保持全赢,如果两个人能力值相等两人都可以赢 思路:排序后只要保证n + 1个人的能力值大于第n个人的能力值即可 #i...
  • sasuke__
  • sasuke__
  • 2017年08月23日 10:35
  • 202

Codeforces Round #395 (Div. 2)(ABCD)

ps:打完这场cf才知道自己真的很菜,还是停留在AB题的水平,有时候CD其实很简单,但就是想不到,别人一眼看出而我就是想不到,有时候想到了点子上但就是突破不了 题目链接:  Codeforc...
  • qq_34731703
  • qq_34731703
  • 2017年02月03日 12:50
  • 501

Codeforces Round #258 (Div. 2)-(A,B,C,D,E)

A:Game With Sticks 水题。。。每次操作,都会拿走一个横行,一个竖行。 所以一共会操作min(横行,竖行)次。 #include #include #include #include ...
  • rowanhaoa
  • rowanhaoa
  • 2014年07月25日 14:39
  • 1484

【解题报告】Codeforces Round #401 (Div. 2)

简略的解题报告。
  • TRiddle
  • TRiddle
  • 2017年02月25日 17:55
  • 415

Codeforces Round #374 (Div. 2) 终场翻盘记

讲道理这场cf本来是不想打的,因为感觉时间有点晚(主要还是国庆作业爆表了)。。后来不知道为什么还是决定打了。        开场前发现注册人数又8000+,(为什么我一打比赛就8000+啊)     ...
  • lych_cys
  • lych_cys
  • 2016年10月01日 09:48
  • 734

Codeforces Round #460 (Div. 2)题目题解

A.Supermarket (水题) #include #include #include #include #include using namespace std; int mai...
  • wyxeainn
  • wyxeainn
  • 2018年01月31日 23:17
  • 81

Codeforces Round #444 (Div. 2)-贪心&尺取-Ratings and Reality Shows

http://codeforces.com/contest/887/problem/D 一个模特有两种活动。 ① 拍照片,挣钱 a。 ②开演唱会,花费b 给定模特这两种工作的时间表。 模特可以...
  • qq_35781950
  • qq_35781950
  • 2017年11月11日 20:11
  • 130

Codeforces Round #427 (Div. 2) A B C D

A. Key races time limit per test 1 second memory limit per test 256 megabytes input standard i...
  • sinat_35406909
  • sinat_35406909
  • 2017年08月01日 02:03
  • 699

Codeforces Round #455 (Div. 2)-A,B,C,D,E

http://codeforces.com/contest/909 差F题了,有机会再补吧。F是思维题。 断断续续补了好久。。 比赛就做了A,B 。 A 给你两个名字,要求一个名字由这两个的...
  • qq_35781950
  • qq_35781950
  • 2018年01月08日 18:42
  • 47
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces Round #369
举报原因:
原因补充:

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