#4346. 「2024.06三级」三足鼎立
题目描述
当三个国家中的任何两国实力之和都大于第三国的时候,这三个国家互相结盟就呈"三足鼎立"之势,这种状态是最稳定的。
现已知本国的实力值,又给出 n 个其他国家的实力值。我们需要从这 n 个国家中找 2 个结盟,以成三足鼎立。有多少种选择呢?
输入格式
输入首先在第一行给出 2 个正整数 n(2 ≤ n ≤
)和 P( ),分别为其他国家的个数、以及本国的实力值。随后一行给出 n 个正整数,表示n 个其他国家的实力值。每个数值不超过
,数字间以空格分隔。
输出格式
在一行中输出本国结盟选择的个数。
样例
样例输入
7 30 42 16 2 51 92 27 35样例输出
9样例解释
能联合的另外 2 个国家的 9 种选择分别为: {16, 27}, {16, 35}, {16, 42}, {27, 35}, {27, 42}, {27, 51}, {35, 42}, {35, 51}, {42, 51}。
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n,p;
cin>>n>>p;
int a[110000];
for(int i = 0;i<n;i++)
{
cin>>a[i];
}
int sum = 0;
for(int i = 0;i<n-1;i++)
{
for(int j = i+1;j<n;j++)
{
if(a[i]+a[j]>p && a[i]+p>a[j] && a[j]+p>a[i])
{
sum++;
}
}
}
cout<<sum;
return 0;
}
#208. 我家的门牌号
题目描述
我家住在一条短胡同里,这条胡同的门牌号从1开始顺序编号。
若所有的门牌号之和减去我家门牌号的两倍,恰好等于n,求我家的门牌号及总共有多少家。
数据保证有唯一解。
输入格式
一个正整数n。n < 100000。
输出格式
一行,包含两个正整数,分别是我家的门牌号及总共有多少家,中间用单个空格隔开。
样例
样例输入
100样例输出
10 15
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n;
cin>>n;
int i = 1;
while(1)
{
int sum = 0;
for(int j = 1;j<=i;j++)
{
sum = sum + j;
}
for(int j = 1;j<=i;j++)
{
if(sum-j*2 == n)
{
cout<<j<<" "<<i<<endl;
return 0;
}
}
i++;
}
return 0;
}
#3890. 最接近的分数
题目描述
分母不超过 N 且 小于 A/B 的最大最简分数是多少?
输入格式
三个正整数N,A,B,相邻两个数之间用单个空格隔开。1 <= A < B < N <= 1000。
输出格式
两个正整数,分别是所求分数的分子和分母,中间用单个空格隔开。
样例
样例输入
100 7 13样例输出
50 93
cpp
#include<iostream>
#include<iomanip>
using namespace std;
double m;
double max_value = -1;
int max_fm = -1;
int max_fz = -1;
bool ifzuijian(int a,int b);
int main()
{
int n,a,b;
cin>>n>>a>>b;
m = 1.0*a/b;
for(int fm = 1;fm<=n;fm++)
{
for(int fz = 1;fz<fm;fz++)
{
double v = 1.0*fz/fm;
if(ifzuijian(fz,fm)==true && v<m)
{
if(v>max_value)
{
max_value = v;
max_fz = fz;
max_fm = fm;
}
}
}
}
cout<<max_fz<<" "<<max_fm<<endl;
return 0;
}
bool ifzuijian(int a,int b)
{
for(int i = 2;i<=min(a,b);i++)
{
if(a%i==0 && b%i==0) return false;
}
return true;
}
#6197. 菲波那契数列(2)
题目描述
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。
输入格式
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1≤a≤1000000)。
输出格式
n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数对1000取模得到的结果。
样例
样例输入
4 5 2 19 1样例输出
5 1 181 1
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int a[1000000];
int main()
{
a[1] = 1;
a[2] = 1;
for(int i = 3;i<=1000000;i++)
{
a[i] = (a[i-1] + a[i-2])%1000;
}
int n;
cin>>n;
for(int i = 0;i<n;i++)
{
int b;
cin>>b;
cout<<a[b]<<endl;
}
return 0;
}
#4193. 因子问题
题目描述
任给两个正整数N、M,求一个最小的正整数a,使得a和(M-a)都是N的因子。
输入格式
包括两个整数N、M。N不超过1,000,000。
输出格式
输出一个整数a,表示结果。如果某个案例中满足条件的正整数不存在,则在对应行输出-1
样例
样例输入
35 10样例输出
5
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
for(int a = 2;a<m;a++)
{
if(n%(m-a)==0 && n%a==0)
{
cout<<a;
return 0;
}
}
cout<<-1;
return 0;
}
#5063. Minecraft
题目描述
Minecraft 是一个几乎无所不能的沙盒游戏,玩家可以利用游戏内的各种资源进行创造,搭建自己的世界。
在 Minecraft 中,基本的建筑元素是边长为 1 个单位的立方体,Tony 想用 N 个这种小立方体搭建一个长方体,并用他珍藏已久的贴纸对其进行装饰。
如果一张贴纸可以贴满小立方体的一个面。那么,他需要用掉多少张贴纸呢?
输入格式
一个整数 N,表示小明所拥有的小立方体的个数。N 不会超过 1000。
输出格式
一个整数,即小明最少用掉的贴纸有多少张。
样例
样例输入
9样例输出
30
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int v;
cin>>v;
int mi = 9999999;
for(int a = 1;a<=v;a++)
{
for(int b = 1;b<=v/a;b++)
{
int h = v/a/b;
if(v == a*b*h)
{
int s = (a*b+a*h+b*h)*2;
mi = min(mi,s);
}
}
}
cout<<mi;
return 0;
}
#5062. 找和为K的两个元素
题目描述
在一个长度为n(n<1000)的整数序列中,判断是否存在某两个元素之和为k。
输入格式
第一行输入整数序列的长度n和k,n和k以空格间隔。
第二行输入整数序列中的n个整数,整数以空格间隔。
输出格式
如果存在某两个元素的和为k,则输出"yes",否则输出"no"。
样例
样例输入
9 10 1 2 3 4 5 6 7 8 9样例输出
yes
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a[1010];
int n,k;
cin>>n>>k;
for(int i = 0;i<n;i++)
{
cin>>a[i];
}
for(int i = 0;i<n;i++)
{
for(int j = 1;j<n;j++)
{
if(a[i]+a[j] == k)
{
cout<<"yes";
return 0;
}
}
}
cout<<"no";
return 0;
}
#4298. 「2023.05 三级」硬币面值组合
题目描述
使用1角、2角、5角硬币组成 n 角钱。
设1角、2角、5角的硬币各用了a、b、c个,列出所有可能的a, b, c组合。
输出顺序为:先按c的值从小到大,若c相同则按b的值从小到大。
输入格式
一个整数n(1 <= n <= 100),代表需要组成的钱的角数。
输出格式
输出有若干行,每行的形式为: i a b c 第1列i代表当前行数(行数从001开始,固定3个字符宽度,宽度不足3的用0填充),后面3列a, b, c分别代表1角、2角、5角硬币的个数(每个数字固定12个字符宽度,宽度不足的在左边填充空格)。
样例
样例输入
10样例输出
001 10 0 0 002 8 1 0 003 6 2 0 004 4 3 0 005 2 4 0 006 0 5 0 007 5 0 1 008 3 1 1 009 1 2 1 010 0 0 2
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n;
cin>>n;
int cnt = 1;
for(int i = 0;i<=n/5;i++)
{
for(int j = 0;j<=(n-i*5)/2;j++)
{
int a = n-i*5 - j*2;
if(i*5+j*2+a*1==n)
{
if(cnt/10==0) cout<<"00"<<cnt;
else if(cnt/100==0) cout<<"0"<<cnt;
else if(cnt/1000==0) cout<<cnt;
cout<<setw(12)<<a;
cout<<setw(12)<<j;
cout<<setw(12)<<i;
cout<<endl;
cnt++;
}
}
}
return 0;
}
#4299. 「2023.05 三级」数列
题目描述
用以下方式构造数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数a,要求数列中第a个数对1000取模的结果是多少。
输入格式
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 1000000)。
输出格式
n行,每行输出对应一个输入。输出应是一个正整数,为数列中第a个数对1000取模得到的结果。
样例
样例输入
4 5 2 19 1样例输出
5 1 181 1
cpp
#include <bits/stdc++.h>
using namespace std;
int b[1000010];
int main()
{
int n;
cin>>n;
int a[1010];
for(int i = 0;i<n;i++)
{
cin>>a[i];
}
b[1] = 1;
b[2] = 1;
for(int i = 3;i<=1000000;i++)
{
b[i] = (b[i-1]+b[i-2])%1000;
}
cout<<endl;
for(int i = 0;i<n;i++)
{
cout<<b[a[i]]<<endl;
}
return 0;
}
#203. 质数的和与积
题目描述
两个质数的和是 S,它们的积最大是多少?
输入格式
一个不大于10000000的正整数S,为两个质数的和。
输出格式
一个整数,为两个质数的最大乘积。数据保证有解。
样例
样例输入
50样例输出
589
cpp
#include<iostream>
#include<iomanip>
using namespace std;
bool zhishu(long long);
int main()
{
long long s;
cin>>s;
for(long long i = s/2;i<=s;i++)
{
long long a = i;
long long b = s-i;
if(zhishu(a)==true && zhishu(b)==true)
{
cout<<a*b<<endl;
return 0;
}
}
return 0;
}
bool zhishu(long long n)
{
if(n==1||n==0) return 0;
for(long long i = 2;i*i<=n;i++)
{
if(n%i==0) return 0;
}
return true;
}
#4176. 「2023.03 三级」爬楼
题目描述
已知楼梯的数量,可以每次走2级或者3级,求不同的走法数。
例如:楼梯一共有7级,一共3种方法:2 2 3或者 2 3 2 或者 3 2 2。
输入格式
输入包含若干行,每行包含一个正整数N,代表楼梯级数,1 <= N <= 50。 最后一行为0,表示测试结束。
输出格式
不同的走法数,每一行输入对应一行输出
样例
样例输入
5 7 0样例输出
2 3
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n = 0;
int a[100];
while(1)
{
int t;
cin>>t;
if(t==0)
{
break;
}
a[n] = t;
n++;
}
int b[51];
b[1] = 0;
b[2] = 1;
b[3] = 1;
for(int i = 4;i<=50;i++)
{
b[i] = b[i-2]+b[i-3];
}
cout<<endl;
for(int i = 0;i<n;i++)
{
cout<<b[a[i]]<<endl;
}
return 0;
}
#204. 鸡兔同笼[2]
题目描述
一个笼子里面关了鸡和兔子(鸡有 2 只脚,兔子有 4 只脚,没有例外)。
已经知道了笼子里面脚的总数 a,问笼子里面至少有多少只动物,至多有多少只动物。
输入格式
一行,一个正整数 a 。
输出格式
一行,包含两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用一个空格分开。
如果没有满足要求的答案,则输出两个 0,中间用一个空格分开。
样例
输入样例
20输出样例
5 10
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n;
cin>>n;
if(n%2==1)
{
cout<<"0 0";
return 0;
}
if(n%4==0)
{
cout<<n/4<<" ";
}
else if(n%2==0)
{
int t = n-2;
cout<<t/4+1<<" ";
}
cout<<n/2;
return 0;
}
#4173. 课程冲突
题目描述
小 A 修了 n 门课程, 第 i 门课程是从第 ai 天一直上到第 bi 天。
定义两门课程的冲突程度为 : 有几天是这两门课程都要上的。
例如 a1=1,b1=3,a2=2,b2=4 时, 这两门课的冲突程度为 2。
现在你需要求的是这 n 门课中冲突程度最大的两门课的冲突程度。
输入格式
第一行一个正整数 n 表示课程数量。 接下来 n 行,每行两个正整数 ai,bi。 2 ≤ n≤ 1000, 1 ≤ ai ≤ bi ≤ 1000。
输出格式
输出一个整数表示最大的冲突程度。
样例
样例输入
3 1 3 2 4 5 5样例输出
2
cpp
#include<iostream>
#include<iomanip>
using namespace std;
struct couers
{
int sT;
int eT;
};
couers a[1010];
int n;
int ma = -1;
int main()
{
cin>>n;
for(int i = 0;i<n;i++)
{
cin>>a[i].sT>>a[i].eT;
}
for(int i = 0;i<n-1;i++)
{
for(int j = 0;j<n-1-i;j++)
{
if(a[j].sT>a[j+1].sT)
{
swap(a[j],a[j+1]);
}
}
}
for(int i = 0;i<n;i++)
{
for(int j = i+1;j<n;j++)
{
if(a[i].eT>=a[j].sT)
{
int ct = min(a[i].eT,a[j].eT) - max(a[i].sT,a[j].sT) + 1;
ma = max(ma,ct);
}
}
}
cout<<ma;
return 0;
}
#4229. 「2022.06三级」迷信的病人
题目描述
医院为了方便对患者进行建档和管理,引入了9位整数ID号来标识每个病人。
最近医院入住了一个迷信的病人,他认为ID号的好坏直接决定了自己的命运。
他对ID号x有如下要求:
(1)x的前三位数构成的整数是素数
(2)x的后三位数构成的整数是平方数(所谓平方数,是指它是某一个正整数的平方,e.g. 1,4,9,16...)
(3)x中不包含"13"
为了避免不必要的医患矛盾,医院须尽量满足他的需求。
现给定正整数区间[m,n],请你判断存在几个满足病人需求的ID号。
输入格式
两个正整数m,n,以空格隔开。(999999999>=n>=m>=111111111)
输出格式
一个整数(满足要求的ID的个数)。
样例
样例输入
157689476 157689687样例输出
5
cpp
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int a[1005];
int n, m;
int sum = 0;
int main()
{
cin>>m>>n;
for(int i = 2;i * i <= 999;i++)
{
if(a[i] == 1)
{
continue;
}
for(int j = i * i; j <= 999; j += i)
{
a[i] = 1;
}
}
for(int i = m;i<=n;i++)
{
if (a[i / 1000000] == 1)
{
continue;
}
int w = i % 1000;
int g = sqrt(w);
if (g * g != w)
{
continue;
}
bool flag = 1;
for(int j = 1;j<=10000000;j*=10)
{
if(i / j % 100 == 13)
{
flag = 0;
break;
}
}
if(flag == 1)
{
sum++;
}
}
cout<<sum;
return 0;
}
#4205. 「2022.06三级」制作蛋糕
题目描述
小A擅长制作香蕉蛋糕和巧克力蛋糕。制作一个香蕉蛋糕需要2个单位的香蕉,250个单位的面粉,75个单位的糖,100个单位的黄油。制作一个巧克力蛋糕需要75个单位的可可粉,200个单位的面粉,150个单位的糖,150个单位的黄油。一个香蕉蛋糕可以卖出400元,而一个巧克力蛋糕可以卖出450元。为了避免蛋糕变质,每种蛋糕至多只能制作100个。
现已知每种原料的数量,求小A至多可以卖出多少元的蛋糕。
输入格式
依次输入面粉、香蕉、糖、黄油、可可粉的数量,每种原料数量均为不超过100000的整数。
输出格式
输出一个整数,表示最多卖出的钱数。
样例
样例输入
4000 6 2000 500 500样例输出
1700
cpp
#include <bits/stdc++.h>
using namespace std;
int main()
{
int mf,xj,t,hy,kkf;
int sum = 0;
cin>>mf>>xj>>t>>hy>>kkf;
int ma = -99999;
for(int i = 0;i<=min(min(mf/250,xj/2),min(t/75,hy/100));i++)
{
int mf1 = i*250;
int xj1 = i*2;
int t1 = i*75;
int hy1 = i*100;
for(int j = 0;j<=min(min((mf-mf1)/200,kkf/75),min((t-t1)/150,(hy-hy1)/150));j++)
{
int mf2 = j*200;
int kkf2 = j*75;
int t2 = j*150;
int hy2 = j*150;
if(mf2+mf1<=mf&&kkf2<=kkf&&xj1<=xj&&t1+t2<=t&&hy1+hy2<=hy)
{
ma = max(ma,i*400+j*450);
}
}
}
cout<<ma;
return 0;
}
#4229. 「2022.06三级」迷信的病人
题目描述
医院为了方便对患者进行建档和管理,引入了9位整数ID号来标识每个病人。
最近医院入住了一个迷信的病人,他认为ID号的好坏直接决定了自己的命运。
他对ID号x有如下要求:
(1)x的前三位数构成的整数是素数
(2)x的后三位数构成的整数是平方数(所谓平方数,是指它是某一个正整数的平方,e.g. 1,4,9,16...)
(3)x中不包含"13"
为了避免不必要的医患矛盾,医院须尽量满足他的需求。
现给定正整数区间[m,n],请你判断存在几个满足病人需求的ID号。
输入格式
两个正整数m,n,以空格隔开。(999999999>=n>=m>=111111111)
输出格式
一个整数(满足要求的ID的个数)。
样例
样例输入
157689476 157689687样例输出
5
cpp
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int a[1005];
int n, m;
int sum = 0;
int main()
{
cin>>m>>n;
for(int i = 2;i * i <= 999;i++)
{
if(a[i] == 1)
{
continue;
}
for(int j = i * i; j <= 999; j += i)
{
a[i] = 1;
}
}
for(int i = m;i<=n;i++)
{
if (a[i / 1000000] == 1)
{
continue;
}
int w = i % 1000;
int g = sqrt(w);
if (g * g != w)
{
continue;
}
bool flag = 1;
for(int j = 1;j<=10000000;j*=10)
{
if(i / j % 100 == 13)
{
flag = 0;
break;
}
}
if(flag == 1)
{
sum++;
}
}
cout<<sum;
return 0;
}
#6180. 求最大公约数问题
题目描述
给定两个正整数,求它们的最大公约数。
输入格式
输入一行,包含两个正整数(<1,000,000,000)。
输出格式
输出一个正整数,即这两个正整数的最大公约数。
样例
样例输入
6 9样例输出
3
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
int i = max(a,b);
while(true)
{
if(a%i==0 && b%i==0)
{
cout<<i;
break;
}
i--;
}
return 0;
}