计蒜课 光合作用 百度之星2012.12.23题目1

链接:https://nanti.jisuanke.com/t/38

du熊是个爱学习的孩子,他总喜欢在生活中做一些小实验,这次du熊想研究一下光合作用。

du熊的实验材料有如下几样:神奇的种子,普通的纸箱和一些光源。一开始du熊将种子均匀的种在了箱子底部,你可以将其看成X轴,种子的位置为X轴上的点。然后du熊用纸板将箱子盖住,并在纸板上安装了一些光源(具体见图)。神奇的种子会在有光的情况下一直向上生长直到没光为止。现在du熊想知道当实验结束时每颗种子的高度是多少?

顶上的为光源,光源两边与顶部的夹角都为45°,黄色部分为光照,绿色的为植物。

输入第一行给出一个T,表示测试数据的组数。每组数据的第一行是三个整数n,m,H(1≤n≤100,000, 0≤m≤100,000, 1≤H≤10,000),n表示种子数(编号1-n),m表示光源数,H表示箱子的高度。接下来m行,每行一个整数Xi表示第i个光源在顶部的位置。

对于每组测试数据,请输出n行,每行一个数表示第i颗种子的最终高度。

数组没clear导致wa了一天  难过....

很显然 正常人都能想到二分,但是这个题,都是整数的情况下 BFS一趟就OK了 O(n+h)解法..  ,其实 哪怕是小数离散化加优先队列也是可以做的...只不过把大log换成小log了,算常数优化?

...上代码

#include <stdio.h>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 1e5+1e4+10;
int ans[maxn];
bool vis[maxn];
int n,m,h;
vector<int>a,b;
void init()
{
    memset(ans,-1,sizeof(ans));
    memset(vis,0,sizeof(vis));
    a.clear();
    b.clear();
    scanf("%d%d%d",&n,&m,&h);
}
bool F(int pos)
{
    if(pos>=0&&pos<=n+h&&vis[pos]==false) { return vis[pos] =  true;}
    else return false;
}
void BFS()
{
    int t;
    for(int i=0;i<m;i++)
    {
        scanf("%d",&t);
        vis[t] = true;
        a.push_back(t);
    }
    int lim = a.size(),H = h;
    while(lim&&H)
    {
        for(int i=0;i<lim;i++)
        {
            int x = a[i];
            ans[x] = H;
            if(F(x-1)) b.push_back(x-1);
            if(F(x+1)) b.push_back(x+1);
        }
        swap(a,b);
        H--;
        lim = a.size();
        b.clear();
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    for(int i=0;i<T;i++)
    {
        init();
        BFS();
        for(int i=1;i<=n;i++)
        {
            printf("%d\n",max(ans[i],0));
        }
    }
    return 0;
}

AC代码

时间: 2024-10-11 19:46:35

计蒜课 光合作用 百度之星2012.12.23题目1的相关文章

计蒜课/百度的年会游戏(枚举)

题目链接:https://nanti.jisuanke.com/t/15503 题意:中文题诶- 思路:一开始想写的直接模拟gg了,赛后才想到这里可以直接枚举两个色子的点数,再来判断一下当前情况是否可行就好了... 代码: 1 #include <iostream> 2 using namespace std; 3 4 int a[5], x, y; 5 6 void yxl(int& fx, int& cnt){ 7 while(a[cnt] < fx){ 8 fx -

计蒜客-光合作用

题目链接:https://nanti.jisuanke.com/t/38 du熊是个爱学习的孩子,他总喜欢在生活中做一些小实验,这次du熊想研究一下光合作用. du熊的实验材料有如下几样:神奇的种子,普通的纸箱和一些光源.一开始du熊将种子均匀的种在了箱子底部,你可以将其看成X轴,种子的位置为X轴上的点.然后du熊用纸板将箱子盖住,并在纸板上安装了一些光源(具体见图).神奇的种子会在有光的情况下一直向上生长直到没光为止.现在du熊想知道当实验结束时每颗种子的高度是多少? 顶上的为光源,光源两边与

【计蒜客】百度科学家(困难)

[题目]百度科学家(困难) [题意]给定n个非负整数,最终需要选择一个数字集合.m次操作,修改一个非负整数,或规定选择第x个数字则必须选择区间[l,r]内的数字.最终求非空数字集合的最小值.\(n,m \leq 10^5\). 需要特别注意,被替换了的非负整数也是可以选择的.每一个非负整数都是本质不同的,区间[l,r]内的数字指的是当前情况下区间[l,r]内的数字. [算法]主席树优化建图+Tarjan缩点 [题解]考虑朴素做法,每次规定点x向区间内的点连边,修改就建新的点替换进序列,最后Tar

计蒜课_二分法求平方根

教训:代码一直通不过的也许因为数据类型(在本题中int改为long),而不是逻辑问题: 代码如下: 1 #include<iostream> 2 using std::endl; 3 using std::cout; 4 using std::cin; 5 inline bool isRes(long x,long y){//判断 x是否为y的平方根: 6 return (x*x==y)||((x*x<y)&&((x+1)*(x+1)>y)); 7 } 8 int

计蒜课/ 微软大楼设计方案/中等(xjb)

题目链接:https://nanti.jisuanke.com/t/15772 题意:中文题诶- 思路:对于坐标为p1(x1, y1), p2(x2, y2) 的两个核心, 其中 x1 <= x2 用 d(p1, p2) 表示两者间最矮的大楼,则需要时间为: 对于d(p1, p2) >= min(y1, y2)情况,cnt = abs(x2 - x1) + abs(y2 - y1) 对于d(p1, p2) < min(y1, y2)情况,cnt = y1 + y2 - 2*d(p1, p

计蒜课_加一

使用数组的来表示一个较大的数: 1 #include<iostream> 2 using namespace std; 3 void add(int* &a, int length) { 4 int c = 1; 5 //c代表进位,完成对数组的更新,并保留最高为的进位: 6 for (int i = length - 1;i >= 0;i--) { 7 if ((a[i] += c) == 10) { 8 c = 1; 9 a[i] = 0; 10 } 11 else { 12

联想专卖店大促销(计蒜课)

题目链接:传送门 题目大意:略 题目思路:其实问了学长才会做这个题,准确说细节处理都没问题,主要是方向没对(说了跟没说一样),这个题目我们观察数据有1e5组测例,单组测例的单个数据最大1e5 限时1s,所以时间复杂度要求很高.其实有想过二分这种思想但是不知道怎么二分. 我们观察三种礼包,每种礼包其实都可以拆成两部分(1个U盘1个鼠标+X)那么我们可以想到将每件礼品都拆为两部分,然后我们对于U盘和鼠标的数目进行二分, 也就是二分答案.而判断二分值是否合理的依据是我们枚举的U盘和鼠标数<=X的数目.

计蒜课/UCloud 的安全秘钥(hash)

题目链接:https://nanti.jisuanke.com/t/15768 题意:中文题诶- 思路:直接hash就好了,当时zz了没想到... 代码: 1 #include <iostream> 2 #include <stdio.h> 3 #define ll long long 4 using namespace std; 5 6 const int MAXN = 1e5; 7 ll a[MAXN] = {1}; 8 ll w[MAXN]; 9 10 int main(vo

计蒜课 八月模拟赛题解

看见机房有大佬上周写了上面的普及信心赛 于是我康了康 8月的提高组模拟赛 9月的还没开始qwq 真的 有点难 主要是我先打开了T2 我再次 对自己的数学产生了怀疑 我现在还是不会写T2 T1 又又又又都错题了 下次重建图 尽量写vector 都写 邻接表 变量差不多的容易搞混 我这个同学变又写错了 T1 :https://nanti.jisuanke.com/t/41086 题目大意就是 一个有向图 删一个点 把与他直接和间接 相连的点 删掉 然后 求删掉所有点的最小最大代价 : 为了避免这个环