您的位置:首页 > 其它

log的用法(可以说是淋漓尽致了)

2016-05-19 13:56 344 查看
题目链接:点击打开链接

该题目做的到后来的时候就是没有注意数据范围,以至于这道题是做废了,还是自己心里面有点心急,现在正在看2016年world final在泰国举办,感觉那种感觉就是不一样,反正感觉他们就是很细心,读题能力和做题能力都很强,虽然没有身临其境,但也有深刻体会,当然也见到了各种神级的解说员,都是历年来在比赛中的神级人物,时间一分分过去了,这个时候的时间感觉也是无比的珍贵,正如杭电选手csy(claris),据说一年级刷够两千题,而且都不是水题,顿时感觉自己好low,不是好low,简直是没有入门,现在已经有人能够全部ac了,这个水平,我也是无力来回复了,还是弱,,,,,后年是world
 final 已经移位到北大,这个让我很是激动,我感觉我也是预言家了,我很是喜欢北大!!!这个是我的观战感想,也是心灵的震撼,,,,也是orz了,下面言归正传,看这道题目,

#include <stdio.h>
#include<string.h>
#include<math.h>
double num[1001][21];
int a[1001]; //记录每列的负数个数
double s[1001];  //每列的和
int main(int argc, char *argv[])
{
int n,m,i,j;
long long  d;
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(a,0,sizeof(a));
memset(s,0,sizeof(s));
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
scanf("%lld",&d);
if(d<0)
{
if(a[j]>-1)
a[j]++;
//                        判断负数的个数
num[i][j]=log(-1.0*d);
}
else if(d==0)
{
a[j]=-1;  //该列存在0,则该列等于0
}
else
num[i][j]=log(1.0*d);
//                    正数直接忽略
}

double s1=-1.0e12,s3=1.0e12;
//        这个值是什么作用,现在还不知道 ,先往下看看
int k1=-1,k2=-1,k3=-1;
//        这里又有一个数值,可是并不知道是什么作用,先往下看看
for(i=m-1; i>=0; i--) //从右开始
{
if(a[i]==-1&&k2==-1)
{
k2=i;    //该列存在0,则该列等于0
continue;
}

if(a[i]==-1&&k2>-1)  //防止重复赋值
continue;

for(j=0; j<n; j++)
{
s[i]+=num[j][i];
}

if(a[i]%2  && s[i]<s3) //寻找负数最小的
{
s3=s[i];
k3=i;
}
else if(a[i]%2==0  && s[i]>s1)   //寻找正数里最大的
{
s1=s[i];
k1=i;
}
}
if(k1!=-1)           //如果存在正数
printf("%d\n",k1+1);
else if(k2!=-1)     //如果存在0
printf("%d\n",k2+1);
else                 //只有负数
printf("%d\n",k3+1);
}
return 0;
}
利用log的性质,来实现数据的加减
写出这个代码感觉也是思路比较厉害的,但是这样减小数据之后,感直接排序也会过的,我去问下问题,那个乘以1.0就是转化一下浮点数,原来我还是不知道呢,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: