首页 > 其他分享 >信息学奥赛一本通:1404:我家的门牌号

信息学奥赛一本通:1404:我家的门牌号

时间:2024-04-11 11:59:12浏览次数:23  
标签:门牌号 sqrt int 奥赛 首项 home 项数 1404

题目描述】

我家住在一条短胡同里,这条胡同的门牌号从1开始顺序编号。

若其余各家的门牌号之和减去我家门牌号的两倍,恰好等于n,求我家的门牌号及总共有多少家。数据保证有唯一解。

【输入】

一个正整数n。n<100000。

【输出】

一行,包含两个正整数,分别是我家的门牌号及总共有多少家,中间用单个空格隔开。

【输入样例】

100

【输出样例】

12 16

 

【参考程序一】

高斯求和
​​​​

         高斯求和公式为:末项=首项+(项数-1)公差,项数=(末项-首项)公差+1,首项=末项-(项数-1)公差,和=(首项+末项)项数2,即高斯求和公式就是对一个等差数列公差为1时的求和,这个数列的和等于这个数列的首项加上这个数列的末项之和乘以这个数列的项数的积再除以2。
#include<bits/stdc++.h>
using namespace std;

int checkSelf(int a,int n)
{
	for(int i=1;i<a;i++)
	{
		//高斯求和 a*(a+1)/2-3*i=n 
		if(a*(a+1)==(n+3*i)*2)
		{		
			return i;//求出自家门牌号 
		}
	}
	return 0;
 } 

int main()
{
	
	int n,num=0,self=0,result=0;
	cin>>n;
	for(int i=1;;i++)
	{
		result=checkSelf(i,n);
		if(result)
		{
			cout<<result<<" "<<i;
			break;
		}
	}
	
	return 0;
}

【参考程序二】 

sqrt()函数介绍:
sqrt()函数是C语言中用于计算一个数的平方根的数学函数。它接受一个浮点数作为参数,并返回该数的平方根。

sqrt()函数的语法:

double sqrt(double x);
其中,x是要计算平方根的数。

sqrt()函数的应用案例:
假设我们要编写一个程序,要求用户输入一个正数,并计算该数的平方根。我们可以使用sqrt()函数来实现这个功能。
#include<bits/stdc++.h>
using namespace std;
 
int main()
{
    int n,home,x;
    int i;
 
    cin>>n;//输入n
 
    /*
    	设最后门牌号为k,则总和为:k*(k+1)/2
    	设家的门牌号为x,则由题意:k*(k+1)/2=3*x+n
    	即:k*(k+1)=6*x+2*n
    	又:k*(k+1)+k+1>6*x+2*n
    	得:(k+1)*(k+1)>6*x+2*n
    	开方:k+1>sqrt(6*x+2*n)
    	两边减一:k>sqrt(6*x+2*n)-1
    	x取最小值1:home=sqrt(6+2*n)-1
    */
 
    home=sqrt(6+2*n)-1;
    for(i=home;; i++) //从家的门牌号开始逐个尝试
    {
        if((i*i+i-2*n)%6==0)
        {
            x=(i*i+i-2*n)/6;
            if(x<=0)	continue;//x不可能<1
            if(x>0)//找到后
            {
                cout<<x<<" "<<i;//输出
                break;//终止循环
            }
        }
    }
    return 0;
}

【参考程序三】

#include<bits/stdc++.h>
using namespace std;

int main()
{
	
	int n,num=0,self=0;
	cin>>n;
	while(1)
	{
		num++;
		for(int i=1;i<num;i++)
		{
			if(num*(num+1)==(n+3*i)*2)
			{
				self=i;
				cout<<self<<" "<<num;
				return 0;
			}
		}	
	}
	
	return 0;
}

 

标签:门牌号,sqrt,int,奥赛,首项,home,项数,1404
From: https://blog.csdn.net/u014117969/article/details/137633484

相关文章

  • 信息学奥赛一本通:1403:素数对
    【题目描述】两个相差为2的素数称为素数对,如5和7,17和19等,本题目要求找出所有两个数均不大于n的素数对。【输入】一个正整数n(1≤n≤10000)。【输出】所有小于等于n的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出empty。【输入样例】......
  • 信息学奥赛一本通:1398:短信计费
    【题目描述】用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个字以内(包括70个字)。如果你一次所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分割成多条短信发送。假设已经知道你当月所发送的短信的字数,试统计一下你当月短信的总资费。【输入】......
  • 初三奥赛模拟测试4
    初三奥赛模拟测试4\(T1\)最后一课\(100pts\)简化题意:给定\(k,x_{1},y_{1},x_{2},y_{2}\),求\(\min\{(x-x_{1})^2+(k-y_{1})^2+(x-x_{2})^2+(k-y_{2})^2\}\)。正解对\(k,y_{1},y_{2}\)同侧/异侧进行分讨,冲个将军饮马问题即可。点击查看代码llwork(llx1......
  • 初三奥赛模拟测试4
    初三奥赛模拟测试4$T1$最后一课题目描述姬子正要去找Kiana,但在这之前,她还需要去一个地方。在平面直角坐标系上,有一条直线\(y=k\),还有两点\(P(x_1,y_1),Q(x_2,y_2)\)。姬子在点P处,Kiana在点Q处。姬子希望先走到直线\(y=k\)上,然后再去找Kiana。求姬子走到Ki......
  • 初三奥赛模拟测试4
    前言\(CSP-S\)模拟赛,确实比前几次简单多了。\(T1~100pts\):签到题。\(T2~100pts\):二分直接跑即可。\(T3~40pts\):首先他给的这个快读没法用。赛时joker了,打了个\(n^2~DP\),然后优化了\(50min\)换了个转移方程还是\(n^2\),复杂度打假了。因为赛时懒得跑线段......
  • 信息学奥赛一本通题目解析:1085:球弹跳高度的计算(循环)
    【题目描述】一球从某一高度hℎ落下(单位米),每次落地后反跳回原来高度的一半,再落下。编程计算气球在第1010次落地时,共经过多少米?第1010次反弹多高?输出包含两行,第1行:到球第1010次落地时,一共经过的米数。第2行:第1010次弹跳的高度。【输入】输入一个整数hℎ,表示球的初始......
  • 信息学奥赛一本通题目解析:1938:【07NOIP普及组】奖学金(排序)
    【题目描述】某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前55名学生发奖学金。期末,每个学生都有33门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学......
  • 信息学奥赛一本通题目解析:1415:【17NOIP普及组】图书管理员(字符串)
    【题目描述】图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个正整数。每位借书的读者手中有一个需求码,这个需求码也是一个正整数。如果一本书的图书编码恰好以读者的需求码结尾,那么这本书就是这位读者所需要的。小D刚刚当上图书馆的管理员,她知......
  • 信息学奥赛一本通题目解析:1204:爬楼梯(记忆化递归)
    【题目描述】树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级,也可以第一次走两级,第二次走一级,一共3种方法。【输入】输入包含若干行,每行包含一个正整数N,代表楼梯级数,1≤N≤30。【......
  • 初三奥赛模拟测试3
    初三奥赛模拟测试3T1网格图开幕雷击,T1先做2h,糊了个玄学复杂度的做法,会被点叉相交的数据卡,不过数据水,放过去了。考虑正解,枚举正方形可能出现的情况,对于每个正方形,尝试从上一个正方形转移,经过一些预处理,可以做到$O(n)$转移。懒得写正解了,去看其他HZOIers的题解吧T2序......