• 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
    今年好多字符串的题目,太生疏了对字符串;
    第一次参加天梯赛,实力打铁,太水了,托了队友的后退,明年再来过!!
    菜鸡的成长史
  • 相关阅读:
    Ftp、Ftps与Sftp之间的区别
    Previous Workflow Versions in Nintex Workflow
    Span<T>
    .NET Core 2.0及.NET Standard 2.0 Description
    Announcing Windows Template Studio in UWP
    安装.Net Standard 2.0, Impressive
    SQL 给视图赋权限
    Visual Studio for Mac中的ASP.NET Core
    How the Microsoft Bot Framework Changed Where My Friends and I Eat: Part 1
    用于Azure功能的Visual Studio 2017工具
  • 原文地址:https://www.cnblogs.com/qq-1585047819/p/10631411.html
Copyright © 2020-2023  润新知