RC-v1 简版2048

《2048》是一款比较流行的数字游戏,原始的游戏规则是在网格上移动平铺并将相同的数字合并为一个。每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。系统给予的数字方块不是 2 就是 4,玩家要想办法在这小小的 16 格范围中凑出“2048”这个数字方块。
这个游戏自 2014 年发布以来,有了很多变种。现在让我们考虑一个极简的变种:所有方块都落在一个长条轨道中,轨道宽度等于方块边长,并且一端封闭。系统产生的随机数字 A 方块从开放的一端进入轨道排队,如果跟当前端口的数字 B 相等,则 A 消失,B 变成 2B。这个变化可能引起连锁反应,即 2B 如果与其邻居方块的 C 相等,则 2B 方块消失,C 变成 2C;以此类推,直到端口的数字与其邻居不相等、或该数字成为轨道中唯一数字为止。
另一方面,轨道的长度有限,当装满了 m 个方块后,如果下一个方块不能跟端口的方块消掉,则其无法进入轨道,游戏即结束。
本题顺序给出 n 个系统随机产生的数字,请你输出游戏结束时的状态。这里系统给出的数字不限于 2 或 4,可以是任何 2k(k≥1)。

输入格式:

输入首先在一行中给出两个正整数 n(≤104,系统随机产生的数字个数)和 m(≤100,轨道中最多可以容纳的方块数量)。随后一行按照产生的顺序依次给出 n 个入轨的数字 —— 由于每个数字都是 2k,所以输入简化为仅给出幂次 k(1≤k≤100)。例如 32 会被简化为 5,因为 32=25。同行数字间以空格分隔。

输出格式:

在一行中按照从封闭端到开口端的顺序,输出游戏结束(输入结束或轨道满)时轨道中方块上的数值。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例 1:

14 5
2 1 1 3 1 2 2 3 8 1 1 2 2 2

输出样例 1:

4 1 4 8 3

输入样例 2:

14 6
2 1 1 3 1 2 2 3 8 1 1 2 2 2

输出样例 2:

4 1 4 8 4

样例说明:

样例 1 中,由于轨道中最多只能容纳 5 个方块,所以最后两个方块无法放入,游戏结束于输出状态。而样例 2 中,由于可以多放入一个方块,所以倒数第 2 步形成的局面是

4 1 4 8 3 2

最后一个输入的方块与轨道开口处的方块相等,所以仍然可以合并成

4 1 4 8 3 3

最后连锁反应终止于输出状态。

#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int>v,ans;
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        v.push_back(x);
    }
    for(int i=0;i<n;i++)
    {
        if(!ans.size()||(ans.size()&&ans.back()!=v[i]))
        {
            ans.push_back(v[i]);
            if(ans.size()>m)
            {
                ans.pop_back();
                break;
            }
        }
        else
        {
            int t=v[i];
            while(ans.size()&&ans.back()==t)
            {
            	ans.pop_back();
            	t=t+1;
            }
            ans.push_back(t);
        }
    }
    for(int i=0;i<ans.size();i++)
    {
        if(i)cout<<" ";
        cout<<ans[i];
    }
    return 0;
}

RC-v2 为 i 做 e

“为 i 做 e”是最近新出的流行梗。这里的 i 和 e 指 MBTI 人格测试中的不同性格,i 是社恐,e 是外向。“为 i 做 e”就是在一群内向的人中促使自己变成外向(奇奇怪怪无用的知识又增加了)。
给定某次大型活动中的餐桌安排,请你判断一下哪几桌的客人需要“为 i 做 e”了。

输入格式:

输入第一行首先给出正整数 n(≤105),随后 n 行,每行给出一个人的代号和其性格,其中代号由 8 位数字组成,性格是单个字母 ie,其间以空格分隔。
接下来是餐桌安排。首先给出正整数 m(≤103),为餐桌数量,随后 m 行,每行给出一个正整数 k(≤10)以及该桌 k 位客人的代号,用空格分隔。第 i 行对应的是第 i 桌的信息(1≤i≤m)。题目保证没有人在餐桌安排中重复出现,且餐桌上每个人的性格都已给出。

输出格式:

如果一桌客人全是 i 人,则意味着有人要“为 i 做 e”了。请在一行中按递增序输出这些桌的桌号。数字间以 1 个空格分隔,行首尾不得有多余空格。如果这样的餐桌不存在,则在一行中输出 None

输入样例 1:

10
00000000 i
12345678 e
23468270 i
78827341 e
67476289 i
35748108 e
99999999 i
40926483 i
88472901 i
55032849 i
3
3 00000000 67476289 99999999
4 12345678 78827341 35748108 55032849
3 23468270 40926483 88472901

输出样例 1:

1 3

输入样例 2:

10
00000000 i
12345678 e
23468270 i
78827341 e
67476289 i
35748108 e
99999999 i
40926483 i
88472901 i
55032849 i
2
4 78827341 35748108 55032849 00000000
6 12345678 67476289 99999999 23468270 40926483 88472901

输出样例 2:

None
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
string id,ie;
map<string,string>mp;
vector<int>v;
int main()
{
    cin>>n;
    while(n--)
    {
        cin>>id>>ie;
        mp[id]=ie;
    }
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>k;
        int cnt=0;
        for(int j=0;j<k;j++)
        {
            cin>>id;
            if(mp[id]=="i")cnt++;
        }
        if(cnt==k)v.push_back(i);
    }
    if(v.size())
    {
        for(int i=0;i<v.size();i++)
        {
            if(i)cout<<" ";
            cout<<v[i];
        }
    }
    else cout<<"None";
    return 0;
}

 

RC-v3 乘法小宇宙

一个 n 位数的正整数 A=an​an−1​⋯a1​ 和另一个 2 位数的正整数 B=b2​b1​ 相乘,其乘法展开式如下图所示:

form.jpg

其中 C=cn+1​cn​⋯c1​ 是 A 与 b1​ 相乘的结果,D=dn+1​dn​⋯d1​ 是 A 与 b2​ 相乘的结果,P=pn+2​pn+1​⋯p1​ 是 A 与 B 相乘的结果。
若上图中的每一位数字都在一个给定的非零个位数字集合 S 里,则称 A 和 B 属于同一个乘法小宇宙 S。
本题给定乘法小宇宙 S 和 A 的位数,请你找出同属于这个乘法小宇宙中的所有 A 和 B。

输入格式:

输入在一行中给出两个正整数 n(<8)和 K(≤5),分别是 A 的位数和乘法小宇宙 S 中元素的个数。第二行给出 K 个 (0, 10) 区间内的整数,为 S 中的元素。题目保证没有重复元素。数字间以空格分隔。

输出格式:

按照 A 的非递减序输出所有同属于这个乘法小宇宙中的 A 和 B,每行输出一对,数字间以 1 个空格分隔,行首尾不得有多余空格。对同一个 A,按 B 的递增序输出。若没有解,则输出 No Solution

输入样例 1:

4 5
4 2 1 6 5

输出样例 1:

5556 44
6111 24
6111 42

输入样例 2:

3 4
9 2 5 6

输出样例 2:

No Solution

RC-v4 实时中位线 

大考结束后,本题请你实现一个在录入成绩的过程中实时显示中位线分数的功能。即在读入 n 个考分的时候,每读入一个考分就刷新一下当前已经读入的考分的中位线。如果当前考分个数 m 是奇数,中位线是从小到大第 (m+1)/2 个考分的值;如果 m 是偶数,则中位线是从小到大第 m/2 和第 m/2+1 个考分的平均值。

输入格式:

输入第一行给出正整数 n(≤105),随后 n 行,每行给出一个考分,为不超过 100 的非负整数。

输出格式:

对每个输入的考分,在一行中输出该考分被读入后,当前所有已读入的考分的中位线,输出小数点后 1 位。

输入样例:

7
95
78
64
81
33
78
85

输出样例:

95.0
86.5
78.0
79.5
78.0
78.0
78.0
#include<bits/stdc++.h>
using namespace std;
int n,x;
vector<int>v;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        v.push_back(x);
        sort(v.begin(),v.end());
        if(i%2==1)
        {
            printf("%.1lf\n",v[i/2]*1.0);
        }
        else
        {
            printf("%.1lf\n",(v[i/2]+v[(i-1)/2])/2.0);
        }
    }
    
    return 0;
}

 

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部