算法实验一。

问题 A: 判断字符串是否是手机号码

题目描述

手机号码是一串数字,长度为11位,并且第一位必须是1,现在给出一个字符串,我们需要判断这个字符串是否符合手机格式。

输入

多组测试数据。每组数据输入一个字符串。

输出

若该字符串符合手机号码格式,输出1,否则输出0。

样例输入

12345612345

样例输出

1

提示

代码

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s;
    while(cin>>s)
    {
        int b=1;
        if(s[0]!='1'||s.length()!=11)
            b=0;
        for(int i=0;i<s.length();i++)
        {
            if(s[i]<'0'||s[i]>'9')
                b=0;    
        }
        cout<<b<<endl;

    }   
 }

问题 B: 内部收益率

题目描述

img
img

输入

img
img

输出

对于每组数据,输出仅一行,即项目的IRR,四舍五入保留小数点后两位。

样例输入

1
-1 2
2
-8 6 9
0

样例输出

1.00
0.50

提示

代码

#include<iostream>
#include<iomanip> 
using namespace std;
int main()
{
    double cf[15];
    int T;
    double l,r,s,f,m;
    while(cin>>T&&T!=0)
    {
        for(int i=0;i<=T;i++)
        {
            cin>>cf[i];
        }
        l=-1.0;
        r=1e8;
        for(int i=0;i<100;i++)
        {
            s=0;
            f=1.0;
            m=(l+r)/2;
            for(int j=1;j<=T;j++)
            {
                f=f/(1.0+m);
                s=s+cf[j]*f;
            }
            if(s+cf[0]>0)
                l=m;
            else
                r=m;
        }
         cout<<setprecision(2)<<std::fixed<<m<<endl;
    }
}

问题 C: 跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

输入

多组测试样例。每组测试样例包含一个整数n。(1<=n<=100)

输出

每组测试样例输出一行,表示青蛙跳上n级台阶的跳法数量.

所得到的结果模1000000007

样例输入

3
4

样例输出

3
5

提示

代码

#include<iostream>
using namespace std;
long long m=1000000007;
/*int f(int n)
{
    if(n<=1)
        return 1;
    else
        return (f(n-1)%m+f(n-2)%m)%m;
}
*/
long long f(int n)
{
    long long f1=1;
    long long f2=2;
    long long t=0;
    if(n==1)
    {
        return 1;
    }
    else if(n==2)
    {
        return 2;
    }
    else
    {
        for(int i=3;i<=n;i++)
        {
            t=((f1%m)+(f2%m))%m;
            f1=f2;
            f2=t;
        }
        return t;
    }
}
int main()
{
    int n;
    while(cin>>n)
    {
        cout<<f(n)<<endl;
    }
}

问题 D: 奶牛的聚会

题目描述

农历新年马上就要到了,奶牛们计划举办一次聚会庆祝新年的到来。但是,奶牛们并不喜欢走太远的路,这会给他们的聚会带来消极情绪,当一头奶牛的消极指数为Wi,他参加聚会所需行走的距离为si,那么他就会给聚会带来Si3*Wi的消极情绪。所有奶牛所在位置都在一条直线上,已知所有奶牛的坐标和消极指数,求如何确定聚会地点,使得所有奶牛给聚会带来的消极情绪之和最小,输出消极情绪之和的最小值。

输入

第一行包含一个整数 Ca(Ca<=20) ,表示有 Ca 组测试数据。

对于每组测试数据:第一行包含一个整数n(1<=n<=50000) ,表示奶牛的数量。接下来 n 行每行包含两个浮点数Si和wi (-106<=Si<=106, 0<Wi<15)。

输出

对于每组测试数据,输出 “Case #c: ans” ,其中c表示测试数据编号,ans表示消极情绪之和的最小值,结果四舍五入为一个整数。

样例输入

1
5
0.9 2
1.4 4
3.1 1
6.2 1
8.3 2

样例输出

Case #1: 300

提示

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int inf = 0x3f3f3f3f;
int n;
double w[500005];
double s[500005];
double f(double x)
{
    double sum=0;
    for(int i=0;i<n;i++)
    {
        double d=abs(s[i]-x);
        sum+=d*d*d*w[i];
    }
    return sum;
}
int main()
{
    int Ca;
    double l,r;
    double e=1e-6;
    cin>>Ca;
    //double s[50005];
    //int w[50005];
    for(int k=1;k<=Ca;k++)
    {
        //int n;
        cin>>n;
        l=inf;
        r=-inf;
        for(int i=0;i<n;i++)
        {
            cin>>s[i];
            cin>>w[i];
            l=min(l,s[i]);
            r=max(r,s[i]);
        }
        while(r-l>e)
        {
            double m1=(l+r)/2;
            double m2=(m1+r)/2;
            if(f(m1)>f(m2))
                l=m1;
            else
                r=m2;
        }
        cout<<"Case #"<<k<<": "<<ll(f(l)+0.5)<<endl;
    }
}

问题 E: 光合作用

题目描述

蒜头是个爱学习的孩子,他总喜欢在生活中做一些小实验,这次蒜头想研究一下光合作用。蒜头的实验材料有如下几样:神奇的种子,普通的纸箱和一些光源。一开始,蒜头将种子均匀的种在了箱子底部,你可以将其看成 X 轴,种子的位置为 X 轴上的点。然后蒜头用纸板将箱子盖住,并在纸板上安装了一些光源(具体见图,顶上的为光源,光源两边与顶部的夹角都为45度,黄色部分为光照,绿色的为植物。)。神奇的种子会在有光的情况下一直向上生长直到没光为止。现在蒜头想知道当实验结束时每颗种子的高度是多少?

img
img

输入

第一行输入一个整数 T,表示测试数据的组数。

每组数据的第一行是三个整数 n,m,h(1<=n,m<=1e5,0<=m<=1e5,1<=h<=1e4),n表示种子数(编号为1,2…n),m表示光源数,h 表示箱子的高度。

接下来m行,每行一个整数Xi表示第i个光源在顶部的位置。

输出

对于每组测试数据,请输出n行,每行一个数表示第i颗种子的最终高度。

样例输入

2
7 1 2
4
4 4 1
1
2
3
4

样例输出

0
0
1
2
1
0
0
1
1
1
1

提示

这题后来进行了几次重测,请同学们不要惊慌

代码

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int T;
    int mo[100005];
    cin>>T;
    while(T--)
    {
        int n,m,h;
        cin>>n>>m>>h;
        for(int i=1;i<=m;i++)
        {
            cin>>mo[i];
        }
        for(int i=1;i<=n;i++)
        {
            int min=1e5;
            for(int j=1;j<=m;j++)
            {
                if(abs(mo[j]-i)<min)
                    min=abs(mo[j]-i);
            }
            if((h-min)<=0)
                cout<<0<<endl;
            else
                cout<<(h-min)<<endl;
        }
    }
}