很简单的题,还以为是高精度计算,完全没必要。只是数字后面的0要消掉,不过oj似乎有问题,n=8时末尾0没有消,有点扯淡啊。
#include<stdio.h>
char rs[][15= 
{
    
"0 1",
    
"1 2",
    
"2 2.5",
    
"3 2.666666667",
    
"4 2.708333333",
    
"5 2.716666667",
    
"6 2.718055556",
    
"7 2.718253968",
    
"8 2.718278770",
    
"9 2.718281526"
}
;
int main()
{
    
int i;
    printf(
"n e\n");
    printf(
"- -----------\n");
    
for(i = 0; i < 10; i++)
        printf(
"%s\n", rs[i]);    
    
//getchar();
}

/*int nn(int n) 
{
    int i, sum = 1;
    for(i = 1; i <= n; i++)
        sum *= i;
    return sum;
}
double ii(int i)
{
    return 1.0 / nn(i);
}
int main()
{
    int i, j;
    double e;
    for(j = 0; j <= 9; j++)
    {
        e = 0.0;
        for(i = 0; i <= j; i++)
        {
            e += ii(i);
        }
        printf("%d %.9lf\n", j, e);
    }
    getchar();
}
*/



最简单的方式就是先将结果按九位精度输出,然后用字符串保存,输出。注意二维字符数组的使用方式。
posted @ 2012-02-22 18:07 小鼠标 阅读(170) | 评论 (0)编辑 收藏
老鼠与猫咪做交易,贪心算法,不断选取单价最便宜的购买即可
#include<stdio.h>
#include
<stdlib.h>
#define MAX 10000
typedef 
struct 
{
    
float cm;
    
int j;
    
int f;
}
JF;
int cmp( const void *a, const void *b)
{
    JF 
*= (JF *)a;
    JF 
*= (JF *)b;
    
if(p -> cm > q -> cm)
        
return 1;
    
else 
        
return -1;
}

int main()
{
    JF jf[
1001];
    
float left, get;
    
int N;
    
int i, j;
    scanf(
"%f%d"& left, & N); 
    
while(N != -1)
    
{
        
for(i = 0; i < N; i++)//input && sort
        {
            scanf(
"%d%d"&jf[i].j, &jf[i].f);
            
if(jf[i].j != 0//j为商品,f为单价。j==0时单价高到无穷 
                jf[i].cm = 1.0 * jf[i].f / jf[i].j;
            
else
                jf[i].cm 
= MAX;
        }

        qsort(jf, N, 
sizeof(JF), cmp);
        
get = 0;//init
        for(i = 0; i < N && left > 0.0; i++)//trade
        {
            
if(left >= jf[i].f)
            
{
                left 
-= jf[i].f;
                
get += jf[i].j;
            }

            
else
            
{
                
get += jf[i].j * left / jf[i].f;
                left 
= 0.0;
            }

        }

        printf(
"%.3f\n"get);//out 
        scanf("%f%d"& left, & N); 
    }

}

 

1.需要注意的是边界情况,j的输入是可以为0的,这个时候可以将单价cm=f/j设为无穷大。
2.另外还要注意一些细节,结构体中将j、f设为int,cm为float,因此要将cm=1.0*f/j,否则cm的值会为0。
posted @ 2012-02-19 21:56 小鼠标 阅读(256) | 评论 (0)编辑 收藏
前几天自己写了一个qsort函数,操作过程是选取第一个元素作为枢纽元,当时还为自己写出了这个函数沾沾自喜,今天看了《数据结构与算法分析》中的快排分析才知道,我写的代码在极端情况下的时间复杂度为O(N^2)!说来惭愧啊,我立刻用了大小为十万的已排序数组进行测试,结果不出所料,跟编译器自带的qsor函数效率就是天壤之别;当我用自己的排序函数对十万个随机数排序时效率就相差无几了。哎,接着努力吧,小同志!
posted @ 2011-08-22 16:00 小鼠标 阅读(480) | 评论 (1)编辑 收藏
这一题不算难,确定最大值容易,扫描一遍数组即可得,时间复杂度是O(N),结束的地方也好确定,随着max更新就可以了。最难确定的是开始的界low,为此多花了不少冤枉时间!为了确定low,可以像确定high那样再扫描一遍,不过这次要倒着扫描,从high开始,这两个过程几乎是对称的。
#include<stdio.h>
#define M 100010
#define MIN 10000
int main()
{
    
int T,i;
    scanf(
"%d",&T);
    
for(i=1;i<=T;i++)
    
{
        
int N,low,high;
        
long max=-MIN,partsum=0;
        
int num[M];
        scanf(
"%d",&N);
        
int j;
        
for(j=0;j<N;j++)
            scanf(
"%d",&num[j]);      
        
for(j=0;j<N;j++)//正着扫描,确定上界high 
        {
            partsum
+=num[j];
            
if(partsum>max)
            
{
                max
=partsum;
                high
=j;
            }

            
if(partsum<0)
            
{
                partsum
=0;
            }

        }

        
int partsum2=0,max2=-MIN;//这一遍倒过来扫描,确定下界low 
        for(j=high;j>=0;j--)
        
{
            partsum2
+=num[j];
            
if(partsum2>=max2)
            
{
                max2
=partsum2;
                low
=j;
            }

            
if(partsum2<0)partsum2=0;
        }

        
if(j==0)low=0;
        printf(
"Case %d:\n",i);
        printf(
"%d %d %d\n",max,low+1,high+1);
        
if(i!=T)printf("\n");
    }

}
 

花了两个多小时的时间,WA了5次,AC的那一刻实在很爽,相信这也是每个ACMer的原动力所在吧。
posted @ 2011-08-19 21:56 小鼠标 阅读(193) | 评论 (0)编辑 收藏
关于这道题我不想多说,水滴题,最快的方式就是调用qsort()函数了,一点技术含量都没有。不过要是能自己写出qsort()函数就不是那么随意了。
这道题我做了两遍,第一次是调用qsort库函数,感觉不过瘾,所以自己又写了一遍qsort函数。
#include<stdio.h>
#define M 1010
int main()

void sort(int num[],int low,int high)
{        
    
int po=low;//选取第一个元素为比较的初始值 
    int i=low,j=high,term;
    
if(high-low+1>=2)
    
{
    
while(i<=j)
    
{
        
for(;j>=i;j--)
        
{
            
if(num[j]<num[po])
            
{
                term
=num[po];
                num[po]
=num[j];
                num[j]
=term;
                po
=j--;
                
break;
            }

        }

        
for(;j>=i;i++)
        
{
            
if(num[i]>num[po])
            
{
                term
=num[po];
                num[po]
=num[i];
                num[i]
=term;
                po
=i++;
                
break;
            }

        }

    }

    sort(num,low,po
-1);//递归调用 
    sort(num,po+1,high);
    }

}


posted @ 2011-08-19 16:48 小鼠标 阅读(179) | 评论 (0)编辑 收藏

进入学校实验室也已有十八天,学长学姐都很热心,知识讲的不少,可这么多天过去了,就是感觉进步太小。今天又进行了一场比赛,八道题我只在最后30s时才搞定了一道,看看一起来的其他人,少则两三道,多则四五道,我真是汗那!!

这样下去也不是办法,感觉整天都在跟着学长学姐们的步调走,而且还没跟上,总感觉听什么都很吃力。仔细想想,原来是没有系统学习的缘故,前辈们讲的固然很好,但都十分深奥,跳跃性强,什么动态规划啊、最小生成树啊、快速排序啊,虽然以后也一定要学,可对只刚学过C语言的人来说未免有些晦涩。当务之急最好找一本难度适宜的教材,从头到尾看一遍,总比整天对着屏幕发呆好。

慢慢来吧,相信媛姐党姐的水平将来我也会达到的,不急,毕竟一个月时间太短,学不了太多东西。最重要的是学会一种解题的思想,培养坚持的毅力,看着前辈们整天以刷题为乐,自己也仿佛若有所悟。正如党姐第一节课所说的那样:我来实验室是为了什么,奖学金?证书?都不是,我们来这里是为了happy!

posted @ 2011-08-15 19:45 小鼠标 阅读(247) | 评论 (2)编辑 收藏
最近花了五天时间把the C. programming language看了一遍,今天开始刷题。这道题讲的是各处密钥key和密文,已知加密公式,求出原文。题很水,只要把加密公式反过来就行了。
#include<stdio.h>
#include<string.h>
int main()
{
 void changetonum(char ci[],int len);
 void numtochar(char pl[],int len);
 int i,j,k;
 scanf("%d",&k);
 while(k!=0)
 {
  char ci[100],pl[100];
  int len;
  scanf("%s",ci);
  len=strlen(ci);
  changetonum(ci,len);
  for(i=0;i<len;i++)
  {
   pl[k*i%len]=(ci[i]+i)%28;
  }
  pl[i]='\0';
  numtochar(pl,len);
  puts(pl);
  scanf("%d",&k);
 }
}
void changetonum(char ci[],int len)
{  //该函数用于把密文转化为数字
 int i;
 for(i=0;i<len;i++)
 {
  if(ci[i]>='a'&&ci[i]<='z')
  {
   ci[i]=ci[i]-'a'+1;
  }
  else if(ci[i]=='_')ci[i]=0;
  else if(ci[i]=='.')ci[i]=27;
 }
}
void numtochar(char pl[],int len)
{  //用于把解密后的数字转化为原文
 int i;
 for(i=0;i<len;i++)
 {
  if(pl[i]>=1&&pl[i]<=26)pl[i]=pl[i]+'a'-1;
  else if(pl[i]==0)pl[i]='_';
  else if(pl[i]==27)pl[i]='.';
 }
}
要特别注意的是一定要用一个变量len记录原字符串长度,因为在转换过程中可能会出现0('_'对应的数字就是0),这样的话调用strlen函数就无法得出正确的长度。
posted @ 2011-08-13 16:14 小鼠标 阅读(257) | 评论 (0)编辑 收藏
仅列出标题
共13页: First 5 6 7 8 9 10 11 12 13 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

随笔分类(111)

随笔档案(127)

friends

最新评论

  • 1. re: 线段树
  • 是这个样子的,所以在OJ有时候“卡住”了也不要太灰心,没准真的不是自己的原因呢。
    加油,祝你好运啦!
  • --小鼠标
  • 2. re: 线段树
  • 对于编程竞赛来说,Java所需时间一般为C/C++的两倍。合理的竞赛给Java的时间限制是给C/C++的两倍。
  • --伤心的笔
  • 3. re: poj1273--网络流
  • 过来看看你。
  • --achiberx
  • 4. re: (转)ubuntu11.10无法启动无线网络的解决方法
  • 膜拜大神。。查了一个下午资料终于在这里解决了问题。。神牛说的区域赛难道是ACM区域赛。。?
  • --Hang
  • 5. re: 快速排序、线性时间选择
  • 博主,谢谢你的文章。你的方法可以很好的处理分区基准在数组中重复的情况,书上的方法遇到这种输入会堆栈溢出。书上给出了解释但给的方法貌似不简洁。
  • --lsxqw2004

阅读排行榜