您的位置:首页 > 其它

codeforce 277div2

2014-11-12 10:44 253 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: