目录
1 完美立方
时间限制:1000
内存限制:65536
形如 a3= b3 + c3 + d3的等式被称为完美立方等式。例如 123= 63 + 83 + 103 。
编写一个程序,对任给的正整数 N (N≤100),寻找所有的四元组 (a, b, c, d),使得 a3= b3 + c3 + d3 ,其中 a,b,c,d均大于 11, 小于等于 N,且 b≤c≤d 。
输入
一个正整数 N(N≤100)。
输出
每行输出一个完美立方。输出格式为:
Cube = a, Triple = (b,c,d)
其中 a,b,c,d 所在位置分别用实际求出四元组值代入。
请按照 a 的值,从小到大依次输出。
当两个完美立方等式中 a 的值相同,则 b 值小的优先输出、仍相同则 c 值小的优先输出。
样例输入
24
样例输出
Cube = 6, Triple = (3,4,5)
Cube = 12, Triple = (6,8,10)
Cube = 18, Triple = (2,12,16)
Cube = 18, Triple = (9,12,15)
Cube = 19, Triple = (3,10,18)
Cube = 20, Triple = (7,14,17)
Cube = 24, Triple = (12,16,20)
解析:枚举,上code!
不准直接抄!!!
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int N;
cin >> N;
for (int a = 2; a <= N; ++a)
{
for (int b = 2; b < a; ++b)
{
for (int c = b; c < a; ++c)
{
for (int d = c; d < a; ++d)
{
if (a * a * a == b * b * b + c * c * c + d * d * d)
printf("Cube = %d, Triple = (%d,%d,%d)\n", a, b, c, d);
}
}
}
}
return 0;
}
2 不定方程求解
时间限制:1000
内存限制:65536
给定正整数a,b,c。求不定方程 ax+by=c 关于未知数x和y的所有非负整数解组数。
输入
一行,包含三个正整数a,b,c,两个整数之间用单个空格隔开。每个数均不大于1000。
输出
一个整数,即不定方程的非负整数解组数。
样例输入
2 3 18
样例输出
4
解析:还是枚举,具体看代码,上code!
不准直接抄!!!
#include<iostream>
using namespace std;
int main(){
int ans = 0;
int a, b, c;
cin >> a >> b >> c;
for (int i = 0; i <= c; i++) //枚举x的所有可能
{
for (int j = 0; j <= c; j++) //枚举y的所有可能
{
if (a * i + b * j == c) //判断
ans++;
}
}
cout << ans; //输出
return 0;
}
3 分解因数
时间限制:1000
内存限制:65536
给出一个正整数 a ,要求分解成若干个正整数的乘积,即 a = a1· a2 ·a3·...·an,并且 1<a1≤a2≤a3≤...≤ an,问这样的分解的种数有多少。
注意到 a = a 也是一种分解。
输入
第 1 行是测试数据的组数 n(1≤n≤1000) ,后面跟着 n 行输入。每组测试数据占 1 行,包括一个正整数 a (1<a<32768)
输出
n 行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的种数。
样例输入
2
2
20
样例输出
1
4
解析:dfs深搜,上code!
不准直接抄!!!
#include <iostream>
using namespace std;
int dfs(int x, int now)
{
int cnt = 1;
for (int i = now; i * i <= x; i++)
{
if (x % i == 0)
cnt += dfs(x / i, i);
}
return cnt;
}
int main() {
int q;
cin >> q;
while (q--)
{
int x;
cin >> x;
cout << dfs(x, 2);
}
return 0;
}
4 上台阶
时间限制:1000
内存限制:65536
楼梯有 n(1≤n≤30) 阶台阶,上楼时可以一步上 1 阶,也可以一步上 2 阶,也可以一步上 3 阶,编程计算共有多少种不同的走法。
输入
输入的每一行包括一组测试数据,即为台阶数 n(1≤n≤30) 。最后一行为0,表示测试结束。
输出
每一行输出对应一行输入的结果,即为走法的数目。
样例输入
1
2
3
4
0
样例输出
1
2
4
7
解析:用数组和循环解决,上code!
不准直接抄!!!
#include<iostream>
using namespace std;
long long a[75];
int main() {
int n;
a[1] = 1;
a[2] = 2;
a[3] = 4;
for (int i = 4; i <= 71; i++)
a[i] = a[i - 1] + a[i - 2] + a[i - 3];
while (cin >> n && n)
cout << a[n] << endl;
return 0;
}
5 田忌赛马
时间限制:1000
内存限制:6553
在田忌赛马的故事中,孙膑用自己的下等马对战对手的上等马,自己上等马对阵对手的中等马,自己的中等马对阵对手的下等马,从而赢得了胜利。现在即将进行的是N匹马的赛马比赛。双方队伍的马各分为N等。已知只有当我方马的等级比对方马等级高 X 等以上(包含 X )时,我方才可以取得这场比赛的胜利。如果在N场比赛中我方的胜场数大于对方,则我方取得最终的胜利。现在已知对方这 N 场比赛的出战方案,请计算所有令我方最终获胜的出战方案。
输入
第一行两个整数, N 和 X 。0≤X<N≤9 。 第二行 N 个正整数,A1, A2,..., AN 。Ai表示第 i 场比赛对方马的等级,1≤i≤N。等级越高越强。
输出
按字典序输出所有我方最终获胜的方案,每个方案一行。每行是 N 个正整数,两两之间以一个空格分隔,第 i 个数表示我方第 i 场比赛马的等级。
样例输入1
3 1
3 2 1
样例输入2
3 0
3 1 2
样例输出1
1 3 2
样例输出2
1 2 3
1 3 2
2 1 3
3 1 2
3 2 1
解析:dfs,上code!
不准直接抄!!!
#include<iostream>
using namespace std;
int n,x;
int a[15];//对方
bool b[15];//我方可用马匹
int c[15];//我方出场顺序
void dfs(int step){
if(step>n){//如果都安排完了
int w=0;//赢得场数
for(int i=1;i<=n;i++){
if(c[i]-a[i]>=x){//赢了
w++;
}
}
if(w>n/2){//赢超过一半
for(int i=1;i<=n;i++){
cout<<c[i]<<" ";//输出
}
cout<<endl;//空格
}
return;
}
for(int i=1;i<=n;i++){//循环按字典序安排马匹
if(b[i]==0){
b[i]=1;
c[step]=i;
dfs(step+1);
b[i]=0;
}
}
}
int main(){
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
}
dfs(1);//深搜
return 0;
}
作者制作不易,喜欢就点个赞吧!