目录
碰碰车
难度:钻石 占用内存:128 M时间限制:1秒
游乐园玩碰碰车,其中有一种碰碰车是在一条直线上行驶。该碰碰车有一个初始朝向和初始位置,并且以每秒一个单位的速度向初始方向前行,当它和其它碰碰车相遇时,它们会立刻掉头(由于速度很快,掉头时间可以忽略)。你可以算出它们在t秒后的位置吗?
//
// Created by abner on 2024/1/31.
//
#include <bits/stdc++.h>
using namespace std;
struct CAR{
int ID;
int x;
int f;
}car[1010];
bool cmp1(CAR a,CAR b){return a.x <= b.x;}
bool cmp2(CAR a,CAR b){return a.ID <b.ID;}
int n,t,tmp[1010];
int main(){
cin>>n >>t;
for(int i=0;i<n;i++){
cin >> car[i].x >>car[i].f;
car[i].ID = i+1;
}
sort(car,car +n,cmp1);
for (int i=0;i<n;i++) {
tmp[i] = car[i].ID;
car[i].x = car[i].x + car[i].f * t;
}
sort(car,car +n,cmp1);
for (int i=0;i<n;i++){
car[i].ID =tmp [i];
if (i<n-1&&car[i].x == car[i+1].x ||
i>0 && car[i].x == car[i-1].x)
car[i].f =0;
}
sort(car,car + n,cmp2);
for (int i=0;i<n;i++,puts("")){
cout << car[i].x<<" "<<car[i].f;
}
return 0;
}
小码哥与机器人
难度:黄金时间限制:1秒四 占用内存:128 M
小码哥新买了一个机器人,但是这个机器人因为很便宜只能做三个动作
三个动作:前进FD,倒退BK和重复REPEAT。
FD后加数字表示前进多少步;
BK后加数字表示后退多少步;
REPEAT 后加数字再加方括号,表示重复方括号里的命令
三个动作加的数字均为正整数。
命令的格式:
1.FD与BK命令组合:
2.REPEAT 命令内加REPEAT命令与FD、BK组合,且REPEAT排在最后。
//
// Created by abner on 2024/1/31.
//
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll solve(){
string s;
char c,k;
ll n,ans =0;
while (cin >> c){
if(c== ']')
break;
cin >>s >> n;
if (c =='R') {
cin >> k;
ans += n * solve();
}
if (c=='B')
ans -= n;
if (c=='F')
ans += n;
}
return ans;
}
int main() {
cout << abs(solve());
return 0;
}
小码哥的跳棋游戏
少难度:黄金 时间限制:1秒巴:占用内存:128 M
小码哥喜爱跳棋。跳棋游戏在一条直线上,一共几个位置(1~n),每个位置有2个状态:0表示没有棋子,1表示有棋子。小码哥的棋子自然是能通过没有棋子的位置。当面前有1个棋子时,小码哥可以直接跳过。当有两个及以上棋子连在一起时,小码哥的棋子是跳不过去的。这时候,就要花费能量,破坏掉一些棋子,才能跳过。已知破坏一枚棋子需要花费一点能量。小码哥的棋子从第0个位置出发,现在要求小码哥到达终点(第几个位置)至少需要花费多少能量?
格式
输入格式:第1行包含一个正整数n;
第2行 n 个整数 ai,表示棋盘的状态。
//
// Created by abner on 2024/1/31.
//
#include <bits/stdc++.h>
using namespace std;
int n,a[100005],ans;
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i < n; i++)
if (a[i] && a[i + 1]) {
a[i + 1] = 0;
ans++;
}
ans += a[n];
cout << ans << endl;
return 0;
}
竖直打印机
难度:黄金时间限制:1秒四 占用内存:256 M
小码哥买了一台很神奇的打印机,它能竖直地打印单词,给一个字符串,他能按单词出现的顺序竖直返回单词。
单词应该以字符串列表的形式返回,必要时用空格补位,但输出尾部的空格需要删除(不允许尾随空格)
必要时以空格补位指的是;在竖直打印单词过程中,若出现中间的单词长度小于相邻两个单词长度,会有某行该单词没有字母的情况,这时用空格补位。
输出尾部空格的删除指的是:输出最后一行的末尾没有空格,
现要求你按照要求复制一个打印机。
//
// Created by abner on 2024/1/31.
//
#include <bits/stdc++.h>
using namespace std;
struct NODE{
string str;
int len;
};
int main(){
vector<NODE>aa;
int maxn = 0,cnt =0;
string tmp;
while (cin >> tmp) {
int len = tmp.length();
maxn = max(maxn, len);
aa.push_back({tmp, len});
cnt++;
}
for(int i = 0;i<maxn;i++) {
string tmp = "";
for (int j = 0; j < cnt; j++) {
if (aa[j].len >= i + 1)
tmp += aa[j].str[i];
else
tmp += " ";
}
cout << tmp << endl;
}
return 0;
}
排队
时间限制:1秒难度:黄金巴: 占用内存:128 M
课间休息做游戏,要求男孩们和女孩们排成一队,最初按照加入队伍的顺序排。然而,过了一会儿。站在女孩们前面的男孩们开始感到造尬,下一秒,他们会让身后的女孩站到自己前面。
让我们更精确地描述这个过程。假设队列中的位置由1到n的整数顺序编号,我们对位置号1中的人首先进行操作。如果在时间X,男孩站在第i个位置,女孩站在第+1个位置,然后下一秒,男孩女孩的位置会交换,也就是此时第个是女孩,第i+1个是男孩。时间是以秒为单位给出的。你现在知道孩子们的初始位置。确定队列在 工秒之后的排列方式。
格式
输入格式:第一行包含两个整数”和t,表示队列中的人数和队列将转换成需要查找的排列的时间:下一行输入一个字符串8,s仅由B和G 构成(B表示男孩,G表示女孩)。
输出格式:一个字符串,表示最后的队列。
//
// Created by abner on 2024/1/31.
//
#include <bits/stdc++.h>
using namespace std;
int n,t;
string s;
int main(){
cin >>n >>t;
cin >> s;
while (t--){
for (int i=0;i<n-1;i++){
if(s[i] == 'B' && s[i+1] == 'G'){
swap(s[i],s[i+1]);
i++;
}
}
}
cout <<s;
return 0;
}
邮箱地址
多 难度:钻石时间限制:1秒巴:占用内存:128 M
-个地址由<username>@<hostname>[/resource]组成。
其中username 和hostname之间只允许有一个 @;尖括号<>内包含的为必选项,方括号[]内包含的为可选项。如果 /出现,则必须跟有resource字段。各字段要求如下:
1.username 字段允许大写、小写字母,数字、下划线,其长度应在1到16。2.hostname 字段类似网址,允许用一个或多个。来分割,但不允许连续两个。连在一起。同时,hostname不允许以 。开头或结束。每一段的要求同username字段,分隔出的每一部分长度在1到16,hostname字段的总长度在1到32。
3.resource 字段要求同username 字段,不限制长度。
现给出一个地址,请判断是否合法。
格式
输入格式:一行,一个字符串,表示一个地址(保证地址的字符的ASCI在33到127间),地址长度不超过1000字符
输出格式:一行,如果合法输出YES,否则输出NO。
//
// Created by abner on 2024/1/31.
//
#include <bits/stdc++.h>
using namespace std;
string s,u,h,r;
bool check(char ch){
if ((ch >='A' && ch <='Z' || ch >='a' && ch<='z'||
ch >= '0' && ch<= '9' || ch=='_'))
return true;
else
return false;
}
bool username() {
int l = u.size();
if (l == 0 || l > 16)
return false;
for (int i = 0; i < l; i++) {
if (!check(u[i]))
return false;
}
return true;
}
bool hostname(){
int l = h.size();
if(h[0]== '.'|| l== 0 || l>32 || h[l-1] == '.')
return false;
for(int i = 1; i<l-2;i++) {//检查连续两个.的情况
if (h[i] == '.' && h[i + 1] == '.')
return false;
}
int sum = 0;
for (int i=0;i<l;i++) {
if (h[i] != '.' && !check(h[i]))//判断字符是否符合要求
return false;
if (h[i] = ',')//以下为判断每一段长度是否在16以内
sum++;
else {
if (sum > 16)
return false;
sum = 0;
}
}
if(sum>16)
return false;
return true;
}
bool resource(){
int l = r.size();
if(l == 0)
return false;
for (int i=0;i<l;i++){
if (!check(r[i]))
return false;
}
return true;
}
int main() {
int p1, p2;
cin >> s;
p1 = s.find('@'), p2 = s.find('/');
if (p1 == string::npos) {//判断没有@的情况
cout << "NO";
return 0;
}
u = s.substr(0, p1);
//username!赋值
if (p2 == string::npos)//根据有没有/来给hostname!赋值
h = s.substr(p1 + 1);
else
h = s.substr(p1 + 1, p2 - (p1 + 1));
if (p2 != string::npos) {//如果存在/,判断resource,是否合法
r = s.substr(p2 + 1);
if (!resource()) {
cout << "NO";
return 0;
}
}
if (username() && hostname())
cout << "YES";
else
cout << "NO";
return 0;
}