本文主要是介绍光合作用(思维),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
蒜头是个爱学习的孩子,他总喜欢在生活中做一些小实验,这次蒜头想研究一下光合作用。蒜头的实验材料有如下几样:神奇的种子,普通的纸箱和一些光源。一开始,蒜头将种子均匀的种在了箱子底部,你可以将其看成 X 轴,种子的位置为 X 轴上的点。然后蒜头用纸板将箱子盖住,并在纸板上安装了一些光源(具体见图,顶上的为光源,光源两边与顶部的夹角都为45度,黄色部分为光照,绿色的为植物。)。神奇的种子会在有光的情况下一直向上生长直到没光为止。现在蒜头想知道当实验结束时每颗种子的高度是多少?
输入
第一行输入一个整数 T,表示测试数据的组数。
每组数据的第一行是三个整数 n,m,h(1<=n,m<=1e5,0<=m<=1e5,1<=h<=1e4),n表示种子数(编号为1,2…n),m表示光源数,h 表示箱子的高度。
接下来m行,每行一个整数Xi表示第i个光源在顶部的位置。
输出
对于每组测试数据,请输出n行,每行一个数表示第i颗种子的最终高度。
样例输入
2
7 1 2
4
4 4 1
1
2
3
4
样例输出
0
0
1
2
1
0
0
1
1
1
1
45°说明可生长高度等于光源高度减去种子和光源的距离长度。
为了避免超时,先对光源按距离排序,然后依次扫描种子,种子的最高高度为它前后两个灯源所能给的最高高度,每次更新这两个光源
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1000000007;
int b[100100];
int main()
{ios::sync_with_stdio(false);int n,m,h,t,x,tip,ans;cin>>t;while(t--){cin>>n>>m>>h;for(int i=1;i<=m;i++)cin>>b[i];sort(b+1,b+m+1);b[m+1]=0x3f3f3f3f;tip=1;for(int i=1;i<=n;i++){while(i>=b[tip+1]) tip++;ans=0;if(abs(b[tip]-i)<=h) ans=max(ans,h-abs(b[tip]-i));if(abs(b[tip+1]-i)<=h) ans=max(ans,h-abs(b[tip+1]-i));cout<<ans<<endl;}}return 0;
}
这篇关于光合作用(思维)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!