链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
目录
1031 [NOIP1999]Cantor表
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…
参考博客:https://blog.csdn.net/qq_64214980/article/details/122796476
#include <iostream>
#include <cmath>
using namespace std;
int main(){
// 奇数行时,分子由行数递减,分母由1递增
// 偶数行时,分子由1递增, 分母由行数递减
int n,fz,fm;
cin >> n;
int line,num=0;
line=ceil((sqrt(8*n+1)-1)/2);//line表示位置为n的元素所在的行数
num=(line-1)*line/2;//num表示前面的行数一共有多少个元素
if(line%2==0){//第Line行是偶数行
fz=1; fm=line;
while(num<n-1){
fz++; fm--;
num++;
}
}else{//第line行是奇数行
fz=line; fm=1;
while(num<n-1){
fz--; fm++;
num++;
}
}
cout << fz << "/" << fm << endl;
return 0;
}
1032 最大的差
给定n个数字,请你从中选出两个数字,使得这两个数字的差尽量大,输出这个最大的差。
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main(){
int n,min,max;
cin >> n;
int i;
int arr[n];
for(i=0;i<n;i++){
cin >> arr[i];
}
sort(arr,arr+n);
min=arr[0];
max=arr[n-1];
cout << max-min << endl;
return 0;
}
1033 成绩统计
乎乎帮老师统计成绩,输入n个成绩,请编程统计输出n个成绩的平均分,最高分,最低分。
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n,i,t;
int min,max;
float aver,sum=0;//aver为平均成绩
cin >> n;
int arr[n]={0};
for(i=0;i<n;i++){
cin >> t;
arr[i]=t;
sum+=t;
}
sort(arr,arr+n);
min = arr[0];
max=arr[n-1];
aver=sum/n;
printf("%.2f %d %d",aver,max,min);
return 0;
}
1034 糖果俱乐部
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
中国地质大学(武汉)坐落于南望山下毗邻东湖风景区。为了庆祝“华为杯”中国地质大学(武汉)第十七届ICPC程序设计大赛暨华中地区部分高校第十五届ICPC邀请赛竞赛的举办,校园中开展了许多有趣的热身小活动。 HW\ HW HW听到这个消息非常激动,他赶忙去参加了糖果俱乐部的活动。该活动的规则是这样的:摊位上有 n\ n n堆糖果,第 i\ i i堆糖果有aia_iai个,参与的同学可以选择其中的任意堆,当所选择糖果的总数为偶数就可以把它们都带走啦~试问通过这个活动小 HW\ HW HW最多能在摊位上带走多少枚糖果。
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main(){
int n,t,t1=0,t2=0,sum1=0,sum2=0;
cin >> n;
int arr1[n]={0},arr2[n]={0};//两个数组分别存储偶数和奇数元素
for(int i=0;i<n;i++){
cin >> t;
if(t%2==0){//存储偶数元素
arr1[t1]=t;
t1++;
sum1+=t;
}else{
arr2[t2]=t;
t2++;
sum2+=t;
}
}
if(sum2%2==0){//说明奇数元素的加和为偶数
cout << sum1+sum2 << endl;
}else{//说明需要去掉一个最小的奇数
sort(arr2,arr2+t2);
int min=arr2[0];
sum2-=min;
cout << sum1+sum2 << endl;
}
return 0;
}
1035 数字计数
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
给出n个数字,请你求出在给出的这n个数字当中,最大的数字与次大的数字之差,最大的数字与次小的数字之差,次大的数字与次小的数字之差,次大的数字与最小的数字之差.
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
//要求这四个值没有重复的
int n,i,t,temp;
int min1=100,min2=100,max1=0,max2=0;
cin >> n;
for(i=0;i<n;i++){
cin >> t;
if(t>max1){
max2=max1;
max1=t;
}else if(t<max1&&t>max2){
max2=t;
}
if(t<min1){
min2=min1;
min1=t;
}else if(t>min1&&t<min2){
min2=t;
}
}
printf("%d %d %d %d",max1-max2,max1-min2,max2-min2,max2-min1);
return 0;
}
1036 热杆上的蚂蚁
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
有一个不断升温的杆子,上面有若干个蚂蚁,蚂蚁们需要尽快爬出这个杆子,否则就会因为高温而被烧死。这里假设每只蚂蚁行走的最大速度是 1cm/s. 当一只蚂蚁走到杆的尽头时,就会立即从秆上掉落,从而逃离热杆。我们知道每只蚂蚁在杆上的初始位置,但是,不知道蚂蚁向哪个方向前行。你的任务是计算所有蚂蚁都从杆上逃离可能的最短时间。
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int len,n,t,min;
cin >> len >> n;//杆的长度 (单位:cm) 和杆上蚂蚁数量 n
int time=0;//需要的时间初始化为0
for(int i=0;i<n;i++){
cin >> t;
min=t<(len-t)?t:(len-t);
if(time<min)
time=min;//更新所需要的时间
}
cout << time << endl;
return 0;
}
1037 焦虑的蚂蚁
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
一条长度为n的小径上,挤满了m只蚂蚁,每只蚂蚁有一个初始前进方向(向左或是向右),蚂蚁们的前进速度相同且均为1。小径的两端,均放着上了锁的箱子,箱内盛有美味的食物,蚂蚁们争相前进离开小径。不幸的是,小径十分狭窄,当两只蚂蚁相遇时,它们不得不掉头向着相反的方向前进。当所有的蚂蚁都离开小径时,锁才能够打开,蚂蚁们才能获得美味的食物。因此,蚂蚁们十分焦虑,它们想知道,到底花费多少的时间,它们才能够吃到美味的食物。你能够帮助他们解决问题吗?
参考博客:https://blog.csdn.net/qq_60404548/article/details/125443579
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int n,m;
cin >> n >> m;//分别代表小径的长度,蚂蚁的数量
int a,b;//分别表示蚂蚁的初始方向和坐标
int time=0;
while(m--){
cin >> a >> b;
if(a==0){
time=max(b,time);
}else if(a==1){
time=max(n-b,time);
}
}
cout << time;
return 0;
}
1038 拯救小a
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
小a生活在一个只有26个小写字母的文本里,我们知道在26个小写字母里,a是字典序最小的,所以小a十分的自卑,今天小a实在是受不了了,他想和伙伴们一起逃出这个文本,在逃出之前,他想问问你,这个文本里一共有多少个a?
#include <iostream>
#include <cmath>
using namespace std;
int main(){
char c;
int i=0;
cin >> c;
while(c!='.'){
if(c=='a'){
i++;
}
cin >> c;
}
cout << i << endl;
return 0;
}
1040 YoungManDon'tSayFive
众所周知,年轻人是不讲5的。作为年轻人,你应该继承这样的“优良传统”。
给定一个数串,输出时将其中的数字'5'替换成字符'*'。
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
int main(){
/*获取一行字符,单字符法
char c;
while((c=getchar())&&c!='\n')
//字符串法
char c[100];
gets(c);
while(c[i]!='\0')*/
char c;
char arr[1000010];
int i=0;
while((c=getchar())&&c!='\n'){
arr[i++]=c;
}
for(int j=0;j<i;j++){
if(arr[j]=='5')
cout << "*";
else
cout << arr[j];
}
return 0;
}
1041 魔法数字变换
有一个数字魔法,给你一个正整数n,如果n为偶数,就将他变为n/2, 如果n为奇数,就将他变为乘3加1
不断重复这样的运算,经过有限步之后,一定可以得到1
牛牛为了验证这个魔法,决定用一个整数来计算几步能变成1
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int num=0;//num记录变换的次数,初始化为0
while(n!=1){
if(n%2==0){
n/=2; num++;
}else if(n%2==1){
n=n*3+1; num++;
}
}
cout << num << endl;
return 0;
}
1042 [NOIP2005]陶陶摘苹果
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
#include <iostream>
using namespace std;
int main(){
int ans=0;//表示能够摘到的苹果的数目,初始化为0
int arr[10]={0};//存储每个苹果距离地面的高度
int maxh;//把手伸直的时候能够达到的最大高度
for(int i=0;i<10;i++){
cin >> arr[i];
}
cin >> maxh;
maxh=maxh+30;//能够摘到的最高的苹果
for(int i=0;i<10;i++){
if(arr[i]<=maxh)
ans++;
}
cout << ans << endl;
return 0;
}
1043 [NOIP2004]津津的储蓄计划
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下3元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。
#include <iostream>
using namespace std;
int main(){
int arr[12]={0};//存储每个月的预算金额
int x1=0,x2=0;//分别表示她手里的钱数和存储的钱数
int i,t,temp;
for(i=0;i<12;i++)
cin >> arr[i];
for( i=0;i<12;i++){
t=arr[i];
temp=300-t;//表示这个月预算剩余的钱数
x1=x1+temp;//计算剩余的总钱数
if(x1<0){//出现了某个月钱不够用的情况
cout << -(i+1) << endl;
break;//退出循环
}else{
int x=x1/100;//能够存储多少钱
x2+=x*100;
x1-=x*100;
}
}
if(i==12){
int ans=x2+x2*0.2+x1;
cout << ans << endl;
}
return 0;
}
1044 [NOIP2002]级数求和
已知:Sn= 1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。
现给出一个整数K(1<=k<=15),要求计算出一个最小的n;使得Sn>K。
#include <iostream>
using namespace std;
int main(){
float k;
cin >> k;
double sum=1.0;//存储级数的和 必须用double类型存储
int fm=1;
while(sum<=k){
fm+=1;
sum+=1.0/fm;
}
cout << fm << endl;
return 0;
}
1045 cayun日常之赏月
在cayun星球月亮大小都有一个规律,月亮为每30天一个周期,在这30天的周期里,月亮的大小分别为0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,虽然天气很冷,但某个cayun今天却异常疯癫,不知为何居然想要赏月了。但他想在赏月之前知道今天的月亮到底有多大。
#include <iostream>
using namespace std;
int main(){
int t;
cin >> t;
int a,b;
while(t--){
cin >> a >> b;
if(a>b){//递减 减到1
if(b==0){
cout << b+1 << endl;
}else
cout << b-1 << endl;
}else{//递增,增到15
if(b==15){
cout << b-1 << endl;
}else
cout << b+1 << endl;
}
}
return 0;
}
1046 鹏
化而为鸟,其名为鹏。鹏之背,不知其几千里也。
——《庄子·逍遥游》
HtBest的小鲲长大变成了大鹏,大鹏在天际翱翔,看到了一片绵延的山脉,每座山都有自己的高度,大鹏想穿过这片山脉。由于他只能紧贴地面飞行,他想知道他一共要翻越几次大山(上升->平飞->下降,算一次,其中平飞可以没有),初始时,大鹏在山脉的左端。
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;//表示山脉被分为n段。
int ans=0;//表示需要翻越的次数,初始化为0
//需要翻越的次数即为数列中相邻元素的递增递减次数
int prior,x,flag=0;//flag标志上升操作
cin >> prior;
for(int i=1;i<n;i++){
cin >> x;
if(x>prior){
flag=1;
prior=x;//前驱元素 更新为x
}else if(x<prior){//有下降操作
if(flag){//构成一次翻越
ans++;
flag=0;//flag重新置0
}
prior=x;
}
}
cout << ans << endl;
return 0;
}
1047 D博弈与核心能源动力
ZWY最近喜欢在下课后喝酒,她说:“喝酒是人类进步的动力”。现在,便利商店推出了兑换活动。
1.两个酒瓶可以兑换1瓶酒
2.四个酒瓶盖子可以兑换1瓶酒
她先知道,在当前她所拥有的资金m和一些空酒瓶k、瓶盖g和当前酒价p已知情况下,她最多可以喝到多少瓶酒。
#include <iostream>
using namespace std;
int main(){
int m,k,g,p;//分别是资金 空酒瓶 瓶盖 当前酒价
cin >> m >> k >> g >> p;
int count=0;
int ans=0;//表示最多可以喝到多少瓶酒
while(m>=p||k>=2||g>=4){//只要能再兑换酒就循环
if(m>=p){//可以用钱买酒
count=m/p;//表示钱能够买多少瓶酒
m=m-count*p;
ans+=count;
k+=count;//空酒瓶数+count
g+=count;//瓶盖数+count
}
if(k>=2){//可以用酒瓶兑酒
count=k/2;//求出可以兑换多少瓶酒
k=k-count*2;
ans+=count;
k+=count;
g+=count;
}
if(g>=4){//可以用瓶盖兑换酒
count=g/4;
g=g-count*4;
ans+=count;
k+=count;
g+=count;
}
}
cout << ans << endl;
return 0;
}
1048 好数
定义好数:一个三位数,令其百位乘以十位得到的答案等于num,num的个位与这个三位数的个位相等。
求l到r的闭区间内,有多少个好数
#include <iostream>
using namespace std;
void fun(int l,int r){//判断在区间[l,r]内有多少个好数
int i,num,count=0;
int a,b,c;//分别存储数字的百位、十位和个位数字
for(i=l;i<=r;i++){//遍历区间内的元素
c=i%10;
b=(i/10)%10;
a=i/100;
num=a*b;//令num=百位乘以十位
if(num%10==c)
count++;
}
cout << count << endl;
}
int main(){
int t,l,r;
cin >> t;//表示测试的组数
while(t--){
cin >> l >> r;
fun(l,r);
}
return 0;
}
1049 3和5和7
在1~n中、找出能同时满足用3除余2,用5除余3,用7除余2的所有整数。
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
for(int i=1;i<=n;i++){
if((i%3==2)&&(i%5==3)&&(i%7==2)){
cout << i << endl;
}
}
return 0;
}
1050 回文对称数
今天牛牛学到了回文串,他想在数字里面找回文,即回文数,回文数是正着读与倒着读都一样的数,比如1221,343是回文数,433不是回文数。请输出不超过n的回文数。
#include <iostream>
using namespace std;
void fun(int n){
int arr[6];//存储n的各位数字
int i=0,j,temp=n;
while(n){
int t=n%10;
arr[i++]=t;
n/=10;
}
for(j=0;j<i/2;j++){
if(arr[j]==arr[i-1-j]){
continue;
}else{
break;
}
}
if(j==i/2)
cout << temp << endl;
}
int main(){
//输出不超过n的回文数
int n;
cin >> n;
for(int i=1;i<=n;i++){
fun(i);
}
return 0;
}
1051 数位之和
求一个整数的所有数位之和
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int sum=0;//存储整数n的所有数位之和
while(n){
sum+=n%10;
n/=10;
}
cout << sum << endl;
return 0;
}
1052 箱子归位
牛村的中央广场是一块5*5的矩阵空旷广场,广场上有且仅有一个救助箱,每天下班前,牛可乐都要把救助箱推回到广场的中心位置(第三行第三列),牛可乐可以向上下左右四个方向推箱子,一次只能推动一个单位,请问牛可乐要推几次才能把救助箱推回中心位置?
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int i,j,x,y;
int ans=0;//最少推箱子的次数
int arr[6][6]={0};
for(i=1;i<=5;i++){
for(j=1;j<=5;j++){
cin >> arr[i][j];
if(arr[i][j]==1){
x=i; y=j;//用x,y暂存当前位置信息
}
}
}
ans=abs(x-3)+abs(y-3);
cout << ans << endl;
return 0;
}
1053 栗酱和火柴
栗酱一个人闲得无聊的时候总是会一个人玩一些有趣的游戏。
有一天,她在机房里看见了一张图,可能是做acm的学长留下的:
栗酱想知道每一个数字,横着竖着分别有几根火柴呢?(由于火柴商偷工减料,我们认定,只要存在棍子,它就是火柴!)
#include <iostream>
using namespace std;
int main(){
int t,a;
int arr1[10]={2,0,3,3,1,3,3,1,3,3};//存储横着都有多少根火柴
int arr2[10]={4,2,2,2,3,2,3,2,4,3};//存储竖着都有多少根火柴
cin >> t;
while(t--){
cin >> a;
cout << arr1[a] << " " << arr2[a] << endl;
}
return 0;
}
1054 [NOIP2009]多项式输出
一元n次多项式可用如下的表达式表示:
f (x) = anxn+ an-1xn-1 + ... + a1x + a0,a0≠0
其中,aixi 称为i 次项,ai 称为i次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:
1. 多项式中自变量为x,从左到右按照次数递减顺序给出多项式。
2. 多项式中只包含系数不为0的项。
3. 如果多项式n次项系数为正,则多项式开头不出现“+”号,如果多项式 n 次项系数为负,则多项式以“-”号开头。
4. 对于不是最高次的项,以“+”号或者“-”号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于0 次的项,其系数的绝对值为1,则无需输出1)。如果x的指数大于1,则接下来紧跟的指数部分的形式为“x^b”,其中b为x的指数;如果x的指数为1,则接下来紧跟的指数部分形式为“x”;如果x的指数为0,则仅需输出系数即可。
5. 多项式中,多项式的开头、结尾不含多余的空格。
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int n;//表示一元多项式的次数
cin >> n;
int arr[n+1]={0};//存储多项式各项的系数
for(int i=n;i>=0;i--){//让数组下标与次数信息对应
cin >> arr[i];
}
for(int i=n;i>=0;i--){
if(arr[i]>0){
if(i!=n)//不是首项
cout << "+";
if(arr[i]!=1)
cout << arr[i];
if(i!=0&&i!=1){//当x的幂次不为0且不为1时
cout << "x^" << i;
} else if(i==1){//当x的幂次为1时
cout << "x";
}else if(i==0&&arr[i]==1){//当最后一项为1时输出1
cout << arr[i];
}
}else if(arr[i]<0){
cout << "-";//首先会输出负号
if(arr[i]!=-1){//系数为-1时不输出1
cout << abs(arr[i]);
}
if(i==1)//幂次为1时
cout << "x";
else if(i!=1&&i!=0){//当幂次不为1且不为0时
cout << "x^" << i;
}
if(i==0&&arr[i]==-1)当最后一项为-1时输出
cout << abs(arr[i]);
}
}
return 0;
}
1055 更相减损术
利用更相减损术求两个整数的最大公约数,即每次将较大的数变成大数减去小数的值
#include <iostream>
using namespace std;
int main(){
int m,n;
cin >> m >> n;
while(m!=n){
if(m>n){
m=m-n;
} else{
n=n-m;
}
}
cout << m << endl;
return 0;
}