hdu2011多项式求和
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2011
问题描述:
多项式的描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + …
现在请你求出该多项式的前n项的和。
Input
输入数据由2行组成,首先是一个正整数m(m<100),表示测试实例的个数,第二行包含m个正整数,对于每一个整数(不妨设为n,n<1000),求该多项式的前n项的和。
Output
对于每个测试实例n,要求输出多项式前n项的和。每个测试实例的输出占一行,结果保留2位小数。
Sample Input
2
1 2
Sample Output
1.00
0.50
多项式求和问题:
试想一下,如果让你做1+1/2+1/3+1/4+…是不是很容易,但是一正一负交替的,怎么办呢?我们需要设一个标记变量,初始化为1,每次计算后乘个-1,就好了。
//**需要注意的是1/2=0,要使用1.0/2,因为int计算除法会有精度丢失
//**需要注意的是1/2=0,要使用1.0/2,因为int计算除法会有精度丢失
#include<iostream>
#include<cstdio>
using namespace std;
int m;
int main(){
cin>>m;
int k;
while(m--){
int fla=1;
double sum=0;
cin>>k;
for(int i=1;i<=k;i++){
sum=sum+(1.0/i)*fla;
fla*=-1;
}
printf("%.2lf\n",sum);
}
return 0;
}
hdu2012素数判定
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2012
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
Input
输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。
Output
对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。
Sample Input
0 1
0 0
Sample Output
OK
素数判定是个很重要的知识点,根据数据范围确定筛选和判定的方法,复杂度也不一样。
#include<iostream>
#include<cstdio>
using namespace std;
int x,y;
int main(){
while(~scanf("%d%d",&x,&y)&&(x||y)){
//int m=x*x+x+41;
//int n=y*y+y+41;
int fla=1;
for(int i=x;i<=y;i++){
int n=i*i+i+41;
for(int j=2;j*j<n;j++){
//这里不用j<n而是j*j<n,思考一下为什么呢?,只需要判断根号n个数
if(n%j==0)
{
fla=0;
break;
}
}
}
if(fla)
printf("OK\n");
else
printf("Sorry\n");
}
return 0;
}
有兴趣的话了解一下欧拉筛和埃氏筛法。
hdu2013 蟠桃记
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2013
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
什么问题?他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题,呵呵-
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
Input
输入数据有多组,每组占一行,包含一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的。
Output
对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。
Sample Input
2
4
Sample Output
4
22
典型的递推关系式。。我么只需要搞清楚第一项和第二项就ok了,假设桃子总数为x,第一天吃的就是(1/2x)-1,而总数是x,用第一天的来表示总数会得出来关系式,第二天的同样的表示第一天的关系式。解个方程就出来了。
这道题和2042的套路一摸一样,挺容易的。
#include <iostream>
#include<cstdio>
#include<cmath>
using namespace std;
//x表示天数
int f(int n,int x){
if(n==1)return x;
else
return f(n-1,2*(x+1));
}
int main(){
int num;
while(scanf("%d",&num)!=EOF){
printf("%d\n",f(num,1));
}
return 0;
}
不喜欢递归的直接按下面的做。
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
int n;
int main(){
while(~scanf("%d",&n)){
ll sum=1;
for(int i=1;i<n;i++){
sum=2*(sum+1);
}
printf("%lld\n",sum);
}
return 0;
}
hdu2014青年歌手大奖赛_评委会打分
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2014
青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
Input
输入数据有多组,每组占一行,每行的第一个数是n(2<n<=100),表示评委的人数,然后是n个评委的打分。
Output
对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行
Sample Input
3 99 98 97
4 100 99 98 97
Sample Output
98.00
98.50
很久之前写的,这里有一个套路需要注意就是:
我们可以初始min,max为数组第一个元素,然后遍历更新它。
当然我们也可以初始min为负无穷大,max为正无穷大。
#include <iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
int n;
int a[101];
while(scanf("%d",&n)!=EOF){
int i;
double max,min,sum=0.0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
max=a[1];
min=a[1];
for(i=1;i<=n;i++)
{
if(min>a[i]){
double temp;
temp=min;
min=a[i];
a[i]=temp;
}
if(a[i]>max){
double temp;
temp=a[i];
a[i]=max;
max=temp;
}
}
printf("%.2lf\n",(sum-max-min)/(n-2));
}
}
hdu2015偶数求和
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2015
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
Input
输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。
Output
对于每组输入数据,输出一个平均值序列,每组输出占一行。
Sample Input
3 2
4 2
Sample Output
3 6
3 7
思路很明显,找一个计数变量,每次到m个就计算平均值计算。(模拟把,让你怎么做就怎么做)
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int main(){
while(~scanf("%d%d",&n,&m)){
int sum=0,cnt=0;
for(int i=2;i<=2*n;i+=2){
sum+=i;//算到前n-1项,纸上算一算
cnt++;
if(cnt==m&&i!=n*2){
printf("%d ",sum/cnt);
cnt-=m;//加到m个就重新计数,这里也可以直接让它等于0,cnt=0;
sum=0;
}
}
if(sum==0&&cnt==0)continue;
//这里表示这n个数能除尽m
//否则直接输出后面的n-m*k的平均值
printf("%d\n",sum/cnt);
}
return 0;
}