UPC1807 - 2019年我能变强组队训练赛第一场问题 B: Shell Pyramid

题目解读:二分查找+数学。多组输入,多次访问,用一个数组保存每一层有多少个数字,再用另一个数组保存每一层最后一个之前总共有多少个数字,然后二分查找。肯定得用数组存下来,而且数组一定有边界,不然访问这么多次肯定TLE。

做题时的误区:在一层中,光看左边那一个,没注意到右边每一行最后一个正好和每层的包含数字的多少相等,严重怀疑我的眼是瞎的,╮(╯▽╰)╭。打表没确定边界乱打表,根本就跑不出来,(⊙o⊙)…。也是够笨的,边界肯定存在,我连怎么找都不会了。打懵逼了,陷进去出不来了,好菜╮(╯▽╰)╭。

赛后补题:看了一篇好的博客瞬间明了,而且二分还可以用STL里的lower_bound(),O(∩_∩)O哈哈~简洁明了。博客链接

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1100000;
ll a[maxn],b[maxn];
void start()
{
	a[1]=1;b[1]=1;
	for(int i=2;i<maxn;i++)
	  a[i]=i+a[i-1];
	for(int i=2;i<maxn;i++)
	  b[i]=a[i]+b[i-1];
}
int main()
{
	start();
	int t;cin>>t;
	while(t--)
	{
		ll n;cin>>n;
		ll n1=lower_bound(b,b+maxn,n)-b;
		n-=b[n1-1];
		ll n2=lower_bound(a,a+maxn,n)-a;
		n-=a[n2-1];
		cout<<n1<<" "<<n2<<" "<<n<<endl; 
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值