• 2019年天梯赛


                                    彩虹瓶

    rb.JPG

    彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里。

    假设彩虹瓶里要按顺序装 N 种颜色的小球(不妨将顺序就编号为 1 到 N)。现在工厂里有每种颜色的小球各一箱,工人需要一箱一箱地将小球从工厂里搬到装填场地。如果搬来的这箱小球正好是可以装填的颜色,就直接拆箱装填;如果不是,就把箱子先码放在一个临时货架上,码放的方法就是一箱一箱堆上去。当一种颜色装填完以后,先看看货架顶端的一箱是不是下一个要装填的颜色,如果是就取下来装填,否则去工厂里再搬一箱过来。

    如果工厂里发货的顺序比较好,工人就可以顺利地完成装填。例如要按顺序装填 7 种颜色,工厂按照 7、6、1、3、2、5、4 这个顺序发货,则工人先拿到 7、6 两种不能装填的颜色,将其按照 7 在下、6 在上的顺序堆在货架上;拿到 1 时可以直接装填;拿到 3 时又得临时码放在 6 号颜色箱上;拿到 2 时可以直接装填;随后从货架顶取下 3 进行装填;然后拿到 5,临时码放到 6 上面;最后取了 4 号颜色直接装填;剩下的工作就是顺序从货架上取下 5、6、7 依次装填。

    但如果工厂按照 3、1、5、4、2、6、7 这个顺序发货,工人就必须要愤怒地折腾货架了,因为装填完 2 号颜色以后,不把货架上的多个箱子搬下来就拿不到 3 号箱,就不可能顺利完成任务。

    另外,货架的容量有限,如果要堆积的货物超过容量,工人也没办法顺利完成任务。例如工厂按照 7、6、5、4、3、2、1 这个顺序发货,如果货架够高,能码放 6 只箱子,那还是可以顺利完工的;但如果货架只能码放 5 只箱子,工人就又要愤怒了……

    本题就请你判断一下,工厂的发货顺序能否让工人顺利完成任务。

    输入格式:

    输入首先在第一行给出 3 个正整数,分别是彩虹瓶的颜色数量 N(1<N103​​)、临时货架的容量 M(<N)、以及需要判断的发货顺序的数量 K。

    随后 K 行,每行给出 N 个数字,是 1 到N 的一个排列,对应工厂的发货顺序。

    一行中的数字都以空格分隔。

    输出格式:

    对每个发货顺序,如果工人可以愉快完工,就在一行中输出 YES;否则输出 NO

    输入样例:

    7 5 3
    7 6 1 3 2 5 4
    3 1 5 4 2 6 7
    7 6 5 4 3 2 1
    

    输出样例:

    YES
    NO
    NO
    解题思路:和判断火车能不能以这个顺序出站一样,比赛时碰到电源关机了前面那幸福那题都快打好了,心态崩了,电脑重启时还有20多分钟,心想不打那题了,看了下这个题目用栈就好了
    狂敲,结果提交只过了一个测试点 GG!没心情打了!
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N=1e3+5;
     4 int main()
     5 {
     6     ios::sync_with_stdio(false);
     7     int n,m,k,d,arr[N];
     8     for(int i=1;i<=N;i++){
     9         arr[i]=i;
    10     }
    11     cin>>n>>m>>k;
    12     while(k--){
    13         stack<int> sta;
    14         while(!sta.empty()) sta.pop();
    15         int tou=1,flag=0;
    16         for(int i=1;i<=n;i++){
    17             cin>>d;
    18             sta.push(d);
    19             while(!sta.empty()&&sta.top()==arr[tou]){
    20                 sta.pop(),tou++;
    21             }
    22             if(sta.size()>m&&flag==0){
    23                 cout << "NO",flag=1;
    24             }
    25         }
    26         if(flag==0){
    27             if(sta.empty()){
    28                 cout << "YES";
    29             }
    30             else cout << "NO";
    31         }
    32         cout << endl;
    33     }
    34     return 0;
    35 }

                                    特立独行的幸福

    对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数。1 是一个幸福数。此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68,3 次迭代后得到 100,最后得到 1。则 19 就是幸福数。显然,在一个幸福数迭代到 1 的过程中经过的数字都是幸福数,它们的幸福是依附于初始数字的。例如 82、68、100 的幸福是依附于 19 的。而一个特立独行的幸福数,是在一个有限的区间内不依附于任何其它数字的;其独立性就是依附于它的的幸福数的个数。如果这个数还是个素数,则其独立性加倍。例如 19 在区间[1, 100] 内就是一个特立独行的幸福数,其独立性为 2×4=8。

    另一方面,如果一个大于1的数字经过数次迭代后进入了死循环,那这个数就不幸福。例如 29 迭代得到 85、89、145、42、20、4、16、37、58、89、…… 可见 89 到 58 形成了死循环,所以 29 就不幸福。

    本题就要求你编写程序,列出给定区间内的所有特立独行的幸福数和它的独立性。

    输入格式:

    输入在第一行给出闭区间的两个端点:1<A<B104​​。

    输出格式:

    按递增顺序列出给定闭区间 [A,B] 内的所有特立独行的幸福数和它的独立性。每对数字占一行,数字间以 1 个空格分隔。

    如果区间内没有幸福数,则在一行中输出 SAD

    输入样例 1:

    10 40
    

    输出样例 1:

    19 8
    23 6
    28 3
    31 4
    32 3
    

    注意:样例中,10、13 也都是幸福数,但它们分别依附于其他数字(如 23、31 等等),所以不输出。其它数字虽然其实也依附于其它幸福数,但因为那些数字不在给定区间 [10, 40] 内,所以它们在给定区间内是特立独行的幸福数。

    输入样例 2:

    110 120
    

    输出样例 2:

    SAD
    解题思路:题目看懂就会了,看题目看了半天才看懂,赛后进行回顾时还有点事理解错的(题目说的是在那个区间里是独立的就是,比如19在那个区间是独立的,但133进行运算时19,但133不再那个区间)
    但是打到一半,碰到电源了,黑屏了,我怕是个智障!
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N=100006;
     4 int vis[N],jilu[N],p[N];
     5 int gdc(int zhi){
     6     if(zhi==1) return 1;
     7     if(vis[zhi]==1) return 0;  //死循环
     8     vis[zhi]=1;
     9     int sum=0;
    10     while(zhi){
    11         sum=sum+(zhi%10)*(zhi%10);
    12         zhi=zhi/10;
    13     }
    14     gdc(sum);
    15 }
    16 int judge(int zhi){
    17     int sum=0;int q=zhi;
    18     while(zhi){
    19         sum=sum+(zhi%10)*(zhi%10);
    20         zhi=zhi/10;
    21     }
    22     p[sum]=1;
    23 }
    24 int num;
    25 void jidai(int zhi){
    26     if(zhi==1) return;
    27     int sum=0;num++;
    28     while(zhi){
    29         sum=sum+(zhi%10)*(zhi%10);
    30         zhi=zhi/10;
    31     }
    32     jidai(sum);
    33 }
    34 int sushu(int zhi){
    35     int p=sqrt(zhi);
    36     for(int i=2;i<=p;i++){
    37         if(zhi%i==0) return 0;
    38     }
    39     return 1;
    40 }
    41 int main()
    42 {
    43     ios::sync_with_stdio(false);
    44     memset(jilu,0,sizeof(jilu));
    45     for(int i=1;i<=10005;i++){
    46         memset(vis,0,sizeof(vis));int zhi=gdc(i);
    47         if(zhi==1) jilu[i]=1;  //是个幸福数字
    48     }
    49     int n,m;
    50     cin>>n>>m;
    51     memset(p,0,sizeof(p));   //是不是特例的
    52     for(int i=n;i<=m;i++){
    53         judge(i);
    54     }
    55     int flag=0;
    56     while(n<=m){
    57         num=0;
    58         if(jilu[n]==1&&p[n]==0){
    59             jidai(n);
    60             cout << n << " ";
    61             int zhi=sushu(n);
    62             if(zhi==1){
    63                 cout << num*2 << endl,flag=1;
    64             }
    65             else cout << num << endl,flag=1;
    66         }
    67         n++;
    68     }
    69     if(flag==0) cout << "SAD" << endl;
    70     return 0;
    71 }
    View Code

                                     深入虎穴

    著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报。已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门。每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门…… 他的手里有一张表格,是其他间谍帮他收集到的情报,他们记下了每扇门的编号,以及这扇门背后的每一条通路所到达的门的编号。007 发现不存在两条路通向同一扇门。

    内线告诉他,情报就藏在迷宫的最深处。但是这个迷宫太大了,他需要你的帮助 —— 请编程帮他找出距离入口最远的那扇门。

    输入格式:

    输入首先在一行中给出正整数 N(<105​​),是门的数量。最后 N 行,第 i 行(1iN)按以下格式描述编号为 i 的那扇门背后能通向的门:

    K D[1] D[2] ... D[K]
    

    其中 K 是通道的数量,其后是每扇门的编号。

    输出格式:

    在一行中输出距离入口最远的那扇门的编号。题目保证这样的结果是唯一的。

    输入样例:

    13
    3 2 3 4
    2 5 6
    1 7
    1 8
    1 9
    0
    2 11 10
    1 13
    0
    0
    1 12
    0
    0
    

    输出样例:

    12
    
    解题思路:进阶题目第一个做的这个,一看这个不是bfs就OK了,开始敲代码,吐槽下温州大学的键盘(失灵,要用力的按才行有些键),打好测试了样例对的就提交了结果2个测试点没过18分,
    我怕是我审题错误,重新看题,结果没错啊,难不成是有特判,改了半天没过,GG! 赛后才知道起点不是1,入读点为0的点才是,不过听说建立无向图以1起点AC了!
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N=1e5+5;
     4 vector<int> G[N];
     5 int in[N],u;
     6 struct Node
     7 {
     8     int B,S;
     9 }p,q;
    10 void bfs(int zhi){
    11     queue<Node> que;
    12     que.push({zhi,1});
    13     while(!que.empty()){
    14         p=que.front(),que.pop();
    15         u=p.B;
    16         for(auto X:G[p.B])
    17         {
    18             que.push({X,p.S+1}),u=X;
    19         }
    20     }
    21 }
    22 int main()
    23 {
    24     ios::sync_with_stdio(false);
    25     int n,d,k;
    26     cin>>n;
    27     memset(in,0,sizeof(in));
    28     for(int i=1;i<=n;i++){
    29         cin>>k;
    30         while(k--){
    31             cin>>d;
    32             G[i].push_back(d);
    33             in[d]++;
    34         }
    35     }
    36     int bh;
    37     for(int i=1;i<=n;i++){
    38         if(in[i]==0) {bh=i;break;}
    39     }
    40     bfs(bh);
    41     cout << u << endl;
    42     return 0;
    43 }
    View Code
    今年好多字符串的题目,太生疏了对字符串;
    第一次参加天梯赛,实力打铁,太水了,托了队友的后退,明年再来过!!
    菜鸡的成长史
  • 相关阅读:
    决定你人生高度的,不是你的才能,而是你的态度
    享受六一的最后几分钟
    DB9 公头母头引脚定义及连接
    bzoj3207--Hash+主席树
    bzoj1901 [ Zju2112 ] --树状数组套主席树
    bzoj1723 [ Usaco2009 Feb ] --前缀和(水题)
    bzoj3932 [ CQOI2015 ] --可持久化线段树
    bzoj3037--贪心
    bzoj3388 [ Usaco2004 Dec ] (神奇的解法)
    bzoj2693--莫比乌斯反演+积性函数线性筛
  • 原文地址:https://www.cnblogs.com/qq-1585047819/p/10631411.html
Copyright © 2020-2023  润新知