codeforce 277div2

http://codeforces.com/contest/486

A注意long long

#include <stdio.h>
#include <iostream>
using namespace std;
typedef long long LL;
LL n;
int main()
{
    while(~scanf("%lld",&n))
    {
        LL f;
        if(n&1)
            f=n/2-n;
        else
            f=n/2;
        printf("%lld\n",f);
    }
    return 0;
}

B

/**
CF 277B
思路:首先将要求数组置1,对于给出的数组若a[i][j]为0,就将要求数组i行j列全置零。
      最后所有的0都置完后,cnt赋1,重新遍历一遍给出数组,看是否对于a[i][j]==1时对应i行j列的元素全为0,是则cnt==0,
      遍历完后cnt==0则NO,否则YES最后输出此时的要求数组即可
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int a[102][102],b[105][105];
int n,m;
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
                b[i][j]=1;
        int cnt=1;
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                scanf("%d",&a[i][j]);
                if(a[i][j]==0)
                {
                    for(int k=0; k<n; k++)
                        b[k][j]=0;
                    for(int k=0; k<m; k++)
                        b[i][k]=0;
                }

            }
        }
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                if(a[i][j]==1)
                {
                    int flag=0;
                    for(int k=0; k<n; k++)
                        if(b[k][j]==1)
                            flag=1;
                    for(int k=0; k<m; k++)
                        if(b[i][k]==1)
                            flag=1;
                    if(flag==0)
                        cnt=0;
                }
            }
        }
        if(cnt==0)
            puts("NO");
        else
        {
            puts("YES");
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<m; j++)
                {
                    printf(j==m-1?"%d\n":"%d ",b[i][j]);
                }
            }
        }
    }
}


C

/**
CF 277C
思路:先不算移动的步数,只处理字符串的前一半,使其与后一半对应,求出所有字符都对应后需要的最小步数sum1,在这个过程中标记所有需改变的位置。
      从m位置(由于我们处理的前一半如果m>n/2,m=n+1-m)开始移动,分别考虑num[0]和num[k-1]和m的几种位置的相对关系,求出最小的移动步数sum2.sum12即为所求
      这题还是有一些细节需要注意的,见代码注释。
      
**/
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int a[100005],num[100005];
int n,k,m;
long long sum;
int abs(int x)
{
    if(x>0)
        return x;
    return -x;
}
int main()
{
    while(~scanf("%d%d%*c",&n,&m))
    {
        if(m>n/2)//细节1
            m=n-m+1;
        for(int i=1;i<=n;i++)
        {
            char t;
            scanf("%c",&t);
            a[i]=t-'a'+1;
        }
        sum=0;
        k=0;
        for(int i=1;i<=n/2;i++)
        {
            if(a[i]!=a[n+1-i])
            {
               int t=abs(a[n+1-i]-a[i]);
               sum+=min(26-t,t);//细节2
               //printf("(%d)\n",min(26-t,t));
               num[k++]=i;
            }
        }
      //  printf("%lld\n",sum);
        if(k==0)
        {
            printf("0\n");
            continue;
        }
        if(num[k-1]<=m&&num[0]<=m)
               sum+=m-num[0];
        else if(num[k-1]>=m&&num[0]>=m)
               sum+=num[k-1]-m;
        else
        {
            //printf("***\n");
            int x=min(m-num[0]+num[k-1]-num[0],num[k-1]-m+num[k-1]-num[0]);//细节3
            x=min(x,min(m-num[0]+n-num[k-1]+1,n-m+num[0]));//细节4
            sum+=x;
        }
        printf("%lld\n",sum);
       /*for(int i=0;i<k;i++)
            printf("%d ",num[i]);
        printf("\n");*/
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值