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 位数字组成,性格是单个字母 i
或 e
,其间以空格分隔。
接下来是餐桌安排。首先给出正整数 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=anan−1⋯a1 和另一个 2 位数的正整数 B=b2b1 相乘,其乘法展开式如下图所示:
其中 C=cn+1cn⋯c1 是 A 与 b1 相乘的结果,D=dn+1dn⋯d1 是 A 与 b2 相乘的结果,P=pn+2pn+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
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll>a,b,c;
set<char>st;
int n,k,x,cnt;
void dfs(ll ans,int cnt,int wei,vector<ll>&v)
{
if(wei==cnt)
{
v.push_back(ans);
return ;
}
for(auto cc:c)
{
dfs(ans*10+cc,cnt+1,wei,v);
}
}
bool check(ll ans)
{
string s=to_string(ans);
for(auto ss:s)
{
if(st.find(ss)==st.end())return false;
}
return true;
}
int main()
{
cin>>n>>k;
for(int i=0;i<k;i++)
{
int x;
cin>>x;
st.insert(x+'0');
c.push_back(x);
}
sort(c.begin(),c.end());
dfs(0,0,n,a);
dfs(0,0,2,b);
for(auto aa:a)
{
for(auto bb:b)
{
if(check(aa*(bb%10))&&check(aa*(bb/10))&&check(aa*bb))
{
//cout<<aa*(bb%10)<<" "<<aa*(bb/10)<<" "<<aa*bb<<endl;
cout<<aa<<" "<<bb<<endl;
cnt++;
}
}
}
if(!cnt)
cout<<"No Solution";
return 0;
}
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;
}