第一题
P. 习题3.3.7 平面分割
题目描述
同一平面内有 n(n≤500)条直线,已知其中 p(p≥2)条直线相交于同一点,则这 n 条直线最多能将 平面分割成多少个不同的区域?
输入格式
两个整数 n(n≤500)和 p(2≤p≤n)。
输出格式
一个正整数,代表最多分割成的区域数目。
样例数据
input
12 5
Copy
output
73
Copy
数据规模与约定
时间限制:1 \text {s}1s
空间限制:256 \text {MB}256MB
首先,试着写出N=1,2,3,4的结果(找规律):
N=1——2个,N=2——4个,N=3——7个,N=4——11个,递推规律已经很明显了,第N个会等于第(N-1)个+N,即 F(N)=F(N-1)+N
代码
#include<bits/stdc++.h>
using namespace std;
int a[1000]={0};
int num(int n){
if(a[n]){
return a[n];
}
a[n]=num(n-1)+n;
return a[n];
}
int main(){
freopen("surface.in","r",stdin);
freopen("surface.out","w",stdout);
int n,p;
cin>>n>>p;
a[p]=2*p;
cout<<num(n);
return 0;
}
第二题
Q. 例题3.4.1 减法
题目描述
一般情况下,拍卖行的拍卖师在拍卖商品的时候都是从低价开始起拍,由买方报价,最后谁出的价格高,商品就归谁所有。但焦作一中信奥公司有个拍卖行,拍卖师小刘在拍卖商品时正好相反:总是从高价开始起拍,如果没有人举成交牌就降价,而且拍卖师在降价时还有规律:假如第i次报价为w元,那么第i+1次报价为w-a或者w-b元,如果降到p元时,你认为价格合适,赶快第一个举成交牌,你就花p元买下了商品。
任务:拍卖师把商品从w元降到p元的方法总数。
输入格式
文件第一行有两个正整w 和p ,第二行有有两个正整a 和b.
1 ≤ w,p ≤ 10^6 , 2 ≤ a,b ≤ 10000, a不等于b.
输出格式
文件只有一行,即所求得的方法总数。注意:测试数据中方法总数不超过MAXlongint.
样例数据
input
10 3
2 3
Copy
output
3
Copy
数据规模与约定
保证2 \leq a,b \leq 100002≤a,b≤10000
时间限制:1 \text {s}1s
空间限制:256 \text {MB}256MB
#include<bits/stdc++.h>
using namespace std;
int x,y,a,b,f[1001000];
int dfs(int k)
{
if(f[k]>=0)return f[k];
if(k<y)return 0;
f[k]=dfs(k-a)+dfs(k-b);
return (f[k]);
}
int main()
{
freopen("pm.in","r",stdin);
freopen("pm.out","w",stdout);
cin>>x>>y>>a>>b;
memset(f,-1,sizeof(f));
f[y]=1;
cout<<dfs(x);
return 0;
}
第三题
习题4.1.13 三值排序
题目描述
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。
一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。
写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。
输入格式
第 1 行:奖牌个数N (1 <= N <= 1000)
第 2 行到第 N+1 行:
每行一个数字,表示奖牌。共N行。(1..3)
输出格式
共一行,一个数字。表示排成升序所需的最少交换次数。
样例数据
input
9
2
2
1
3
3
3
2
3
1
Copy
output
4
Copy
数据规模与约定
时间限制:1 \text {s}1s
空间限制:256 \text {MB}256MB
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n,a[100],b[100],i,a1=0,a2=0,a3=0;
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
if(a[i]==1)a1++;
if(a[i]==2)a2++;
if(a[i]==3)a3++;
}
for(i=1;i<=n;i++){
if(a1>=i)b[i]=1-a[i];
if(a1+a2>=i&&i>a1)b[i]=2-a[i];
if(a1+a2+a3>=i&&i>a2+a1)b[i]=3-a[i]; }
int q1=0,q2=0,w1=0,w2=0;
for(i=1;i<=n;i++){
if(b[i]==1)q1++;
if(b[i]==-1)w1++;
if(b[i]==2)q2++;
if(b[i]==-2)w2++;
}
cout<<max(q1,w1)+min(q2,w2);
}
这不是这道题我不知道哪点错了,只能得到85分。
我发现我基础代码应该是没错。可能是开数组时有点问题。