很简单的题,还以为是高精度计算,完全没必要。只是数字后面的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 *p = (JF *)a;
JF *q = (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 T,N;
int num[M];
scanf("%d",&T);
while(T--)
{
int i,j;
scanf("%d",&N);
for(i=0;i<N;i++)
scanf("%d",&num[i]);
sort(num,0,N);
for(i=0;i<N-1;i++)
printf("%d ",num[i]);
printf("%d\n",num[i]);
}
}
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) |
编辑 收藏