杭电入门100题适合新手看一看(11-15)

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
#include
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

Input
输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。

Output
对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。

Sample Input
0 1
0 0
 

Sample Output
OK

素数判定是个很重要的知识点,根据数据范围确定筛选和判定的方法,复杂度也不一样。

#include
#include
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
      
                if(n%j==0)
                {
                    fla=0;
                    break;
                }
            }
        }
        if(fla)
            printf("OK\n");
        else
            printf("Sorry\n");
    }
    return 0;
}

杭电入门100题适合新手看一看(11-15)_第1张图片
有兴趣的话了解一下欧拉筛和埃氏筛法。
hdu2013 蟠桃记
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2013
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
什么问题?他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题,呵呵-
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?

Input
输入数据有多组,每组占一行,包含一个正整数n(1 Output
对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。

Sample Input
2
4
Sample Output
4
22

典型的递推关系式。。我么只需要搞清楚第一项和第二项就ok了,假设桃子总数为x,第一天吃的就是(1/2x)-1,而总数是x,用第一天的来表示总数会得出来关系式,第二天的同样的表示第一天的关系式。解个方程就出来了。

这道题和2042的套路一摸一样,挺容易的。

#include 
#include
#include
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
#include
#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 Output
对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行

Sample Input
3 99 98 97
4 100 99 98 97
Sample Output
98.00
98.50

很久之前写的,这里有一个套路需要注意就是:
我们可以初始min,max为数组第一个元素,然后遍历更新它。
当然我们也可以初始min为负无穷大,max为正无穷大。

#include 
#include
#include
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
#include
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;
}

你可能感兴趣的:(HDU100道入门)