3、平面分割(surface)
同一平面内有 n(n≤500)条直线,已知其中 p(p≥2)条直线相交于同一点,则这 n 条直线最多能将
平面分割成多少个不同的区域?
【输入格式】
两个整数 n(n≤500)和 p(2≤p≤n)。
【输出格式】
一个正整数,代表最多分割成的区域数目。
【输入样例】
12 5
【输出样例】
73
标程:
#include
#include
using namespace std;
int main()
{
int n,p,i;
long long a[501];
while(cin>>n>>p)
{
a[p]=2*p;
for(i=p+1;i<=n;i++)
a[i]=a[i-1]+i;
cout<<a[n]<<endl;
}
return 0;
}
错误原因:考试时递推式没找出来,此问题已问老师,以后必须解决!
5、蜜蜂路线(bee) 【问题描述】
一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问
你:蜜蜂从蜂房 M 开始爬到蜂房 N,M<N,有多少种爬行路线?
【输入格式】 输入 M,N 的值。
【输出格式】 爬行有多少种路线。
【输入样例】
1 14
【输出样例】
377
标程:
#include<bits/stdc++.h>
using namespace std;
int n,m;
string f1,f2;
string add(string &A ,string B)
{
int g=0;
if(A.size()<B.size())
{
string tmp=A;
A=B;
B=tmp;
}
string tmp(A.size()-B.size(),‘0’);
B=tmp+B;
for(int i=A.size()-1;i>=0;i–)
{
int t=(A[i]-‘0’)+(B[i]-‘0’)+g;
A[i]=t%10+‘0’;
g=t/10;
}
if(g!=0) A.insert(0,string(1,(char)g+‘0’));
return A;
}
int main()
{
cin>>n>>m;
f1=“1”;
f2=“2”;
for(int i=3;i<=(m-n);i++)
{
string tmp=add(f1,f2);
f1=f2;
f2=tmp;
}
cout<<f2<<endl;
}
错误原因:没考虑用高精,爆掉60分,学到了学到了,下次不会错!
6、极值问题(acme)
【问题描述】
已知 m、n 为整数,且满足下列两个条件:
① m、n∈{1,2,…,k},即 1≤m,n≤k
②(n2 -m*n-m2)2 =1
你的任务是:编程输入正整数k(1≤k≤109),求一组满足上述两个条件的m、n,并且使m2 +n2 的值最
大。例如,从键盘输入k=1995,则输出:m=987 n=1597。
【输入样例】
1995
【输出样例】
m=987
n=1597
标程:
#include<bits/stdc++.h>
using namespace std;
int k;
int main(){
scanf("%d",&k);
int f1=1,f2=1,f3=2;
while(f3<=k){
f1=f2,f2=f3,f3=f1+f2;
}
printf("m=%d\nn=%d",f1,f2);
return 0;
}
错误原因:
考试时递推式没推出来,没想到斐波那契数列,反应出递推这块做题不够,还需多刷题!
递推分析:
(n2 -mn-m2)2 =1 此式可化简,换元得如图所示,n可以等于m+n,m可以等于n,
和斐波那契过程一样的,所以m,n就是小于k的两个最大斐波那契数列值!!!
7、火车站(Noip1998)
【问题描述】
火车从始发站(称为第 1 站)开出,在始发站上车的人数为 a,然后到达第 2 站,在第
2 站有人上、下车,但上、下车的人数相同,因此在第 2 站开出时(即在到达第 3 站之前)
车上的人数保持为 a 人。从第 3 站起(包括第 3 站)上、下车的人数有一定的规律:上车的
人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第
n-1 站),都满足此规律。现给出的条件是:共有 N 个车站,始发站上车的人数为 a,最后一
站下车的人数是 m(全部下车)。试问从 x 站开出时车上的人数是多少?若无解输出“No
answer.”(所有数据均在 long 范围内)
【输入格式】a,n,m 和 x
【输出格式】x 站开出时车上的人数
【输入样例】
1 6 7 3
【输出样例】
2
标程:
#include<bits/stdc++.h>
using namespace std;
int sum1[25],sum2[25];
int main()
{
int a,n,m,x;
scanf("%d%d%d%d",&a,&n,&m,&x);
sum1[2]=1,sum1[3]=2;
for(int i=4;i<n;i++)
{
sum1[i]=sum1[i-1]+sum1[i-2]-1;
sum2[i]=sum2[i-1]+sum2[i-2]+1;
}
if((m-asum1[n-1])%sum2[n-1]==0)
{
int b=(m-asum1[n-1])/sum2[n-1];
printf("%d",asum1[x]+b*sum2[x]);
}
else
{
printf(“No answer.”);
}
return 0;
}错误原因:
代码能力有待提高!!!关系式很快推出,代码实现困难!!!多做题!!!别忘了“No answer.”!!!还有个“.”!!!