算法实验一。
问题 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: 内部收益率
题目描述
输入
输出
对于每组数据,输出仅一行,即项目的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度,黄色部分为光照,绿色的为植物。)。神奇的种子会在有光的情况下一直向上生长直到没光为止。现在蒜头想知道当实验结束时每颗种子的高度是多少?
输入
第一行输入一个整数 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;
}
}
}