现在的位置: 首页 > 综合 > 正文

Codeforces Round #278(Div2) A B C

2019年04月11日 ⁄ 综合 ⁄ 共 2072字 ⁄ 字号 评论关闭

比赛的时候写了的三个  结果后两个WA(捂脸)

A. Calculating Function

看到是等差数列减去等差数列立马想到了高中的方法 c++写了一遍  突然发现 诶尼玛这是1e15啊..等差数列公式超了啊 -   -

于是因为cf的oj很*于是python2.7 A了

n=input()
n2=n/2
n1=n2+n%2

s1n=n1+n1*(n1-1)*2/2
s2n=n2*2+n2*(n2-1)*2/2
print s2n-s1n

结果第二天发现别人是这么想的

sum= ( n + 1 ) / 2 * ( n & 1 ? - 1 : 1 );

瞬间感觉自己要吃药了..

B. OR in Matrix

比赛的时候是这么想的定义一个行数组 r[] 一个列数组 c[]

然后 扫一遍矩阵 if( ! B[ i ] [ j ] ) 那么 r[i]=1 和 c[j]=1  就是划掉 r[i] c[j]

再扫一遍矩阵 if( B [ i ] [ j ] && r[i]&& r[j] ) 答案为"NO"  因为行列都被划了

都满足输出YES 再扫一遍 输出矩阵A if( r [ i ] || c [ j ] ) output 0      else output 1

当时木有发现一个bug  列如:

0 0 0

1 1 1

这时候 r[1]  c[1]  c[2]  c[3]  为 1  r[2] 为 0 但是未考虑 c[1~3] 都被划了 r[2]也应为 1   傻*了 -  -

第二天说起这道题  队友跟我说了三个字纯暴力   -  -

就是定义一个新矩阵  要划的时候真的一个个赋值 ..

好吧你赢了

#include <cstdio>
#include <cstring>
#include <algorithm>
#define CLR(a) memset(a,0,sizeof(a))
#define debug \
for(int i=0;i<m;i++){\
    for(int j=0;j<n;j++)\
        printf("%d ",A[i][j]);\
    puts("");\
}\
puts("");
using namespace std;
const int MAXN = 1010;

int A[MAXN][MAXN],B[MAXN][MAXN];

bool ck(int x,int y,int m,int n)
{
    for(int i=0;i<m;i++)
        if(A[i][y])
            return 1;
    for(int i=0;i<n;i++)
        if(A[x][i])
            return 1;
    return 0;
}

int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
        {
            scanf("%d",&B[i][j]);
            A[i][j]=1;
        }
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
        {
            if(!B[i][j])
            {
                CLR(A[i]);
                for(int _=0;_<m;_++)
                    A[_][j]=0;
            }
            //debug;
        }
    int ans=1;

    for(int i=0;i<m&&ans;i++)
        for(int j=0;j<n;j++)
        {
            if(B[i][j]&&!ck(i,j,m,n))
                ans=0;
        }
    if(ans)
    {
        puts("YES");
        for(int i=0;i<m;i++,puts(""))
            for(int j=0;j<n;j++)
                printf("%d ",A[i][j]);
    }
    else puts("NO");
    return 0;
}

C. Palindrome Transformation

这题感觉很高大上其实还是简单小模拟

题意是把字符串变成回文要几步操作

有几个规律可以简化程序:

1.设n =9 p=8      其实等于  p=2 = n-p+1

2.当p 位于前半段(包括中间元素)   在前半段操作数<=在后半段的操作数

3.不用改变的地方可能不用去(废话,某些时候也是有用的)

但是比赛的时候没时间了TAT

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 1e5;

char s[MAXN+10];
int sum[MAXN+10];

int main()
{
    //freopen("c.in","r",stdin);
    int n,m;
    scanf("%d%d",&n,&m);
    scanf("%s",s+1);

    int l=1,r=n/2+n%2,ans=0;
    if(m>r) m=n-m+1;
    int dl=-1,dr=0;
    for(int i=l;i<=r;i++)
    {
        int t=min(abs(s[i]-s[n-i+1]),26-abs(s[i]-s[n-i+1]));
        ans+=t;
        if(!t&&dl)
            dl+=(~dl)?1:2,l++;
        else
            dl=0;

        if(!t)
            dr++;
        else dr=0;

    }

    r-=dr;
    if(l>r)
        l=r=m;

    printf("%d",ans+min(abs(l-m),abs(r-m))+r-l);

    return 0;
}

-------水线-------

选修课讲的挺有意思的  立体声的组成

听着听着就睡着了 TAT

结果在实验室根本动不起来  就把白天补的两道粘上来了..

抱歉!评论已关闭.