2021-01-18

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-a
sum1[n-1])%sum2[n-1]==0)
{
int b=(m-asum1[n-1])/sum2[n-1];
printf("%d",a
sum1[x]+b*sum2[x]);
}
else
{
printf(“No answer.”);
}
return 0;
}错误原因:
代码能力有待提高!!!关系式很快推出,代码实现困难!!!多做题!!!别忘了“No answer.”!!!还有个“.”!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值