oj赛(双周赛第十四次)

目录

神器宝盒

特殊数字

神秘门的密码

找鸭子

银河间的数字之战

小码哥的英语

小码哥的艰难选择

小码哥搭建花圃

科学记数法

世界警察

中转站

安全验证

旅行


计算机的算力比我们强太多了 ,如果是拼单纯的计算力和算力我们毫无胜算

神器宝盒


难度:青铜
①时间限制:1秒
巴占用内存:64M
有一个魔法世界,小码哥是一位勇敢的冒险者。在魔法世界中,有一个神器宝盒,小码哥有多少宝
物放进这个宝盒,宝盒会将里面的宝物复制一份,相当于1个宝物变成了2个宝物,2个宝物变成了
4个宝物,14个宝物变成了28个宝物,但是当放入宝盒的宝物数为1©的倍数时宝盒就会将放入的宝
物吸收,让宝物消失“归零”。
现在小码哥有个宝物,请你帮忙计算这个宝物放入宝盒后能得到多少宝物。
格式
输入格式:一行一个整数n(1≤n≤100000)表示放进宝盒的宝物数量。

//
// Created by abner on 2023/11/8.
//
#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin >>n;
    if(n%10 != 0 )
    cout<<n*2;
    else
    cout <<0;
    return 0;
}

特殊数字


难度:青铜
0时间限制:1秒
巴占用内存:64M
小码哥是一位勇敢的数学冒险家,他正在探索一个神秘的数字迷宫。迷宫中有许多数字,小码哥需
要在一个范围里面[n,N]n(1≤n≤N),N(n≤N≤100000)中找到全部特殊数字,该
数字该数字能同时被2和3整除,并计算全部特殊数字之和。
你能帮他计算范围内的特殊数字之和吗?
格式
输入格式:一行,输入两个数n和N,中间有一个逗号,n(1≤n≤N),N(n≤N≤
100000)表示特定寻找范围。
输出格式:一行整数表示范围内特殊数字之和。

//
// Created by abner on 2023/11/8.
//
#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,N;
    char comma;
    cin >>n >>comma >>N;
    int ans = 0;
    for (int num = n;num <= N;num++){
    if(num%2== 0 && num%3==0){
            ans += num;
}
}
cout <<ans;
return 0;
}

神秘门的密码


子难度:白银
①时间限制:1秒
巴占用内存:64M
小码哥无意中闯入数字世界,数字世界中有道神秘的门堵住了小码哥前进的方向,门上有密码,密
码上写着:“正确密码经过了以下变换:假密码为字符串,若假密码n的长度为奇数时真密
码是123456;若假密码的长度为偶数时,真密码为假密码前一半的字符串和假密码后一半字
符串的反转字符串的拼接结果成的字符串”。如假密码为:ye1he5w4r,真密码为123456;若假密
码为3j83u5jf,真密码为3j83fj5u。小码哥不知道真密码是什么,你能帮他吗?
格式
输入格式:一行一个长度为s(1≤s≤1000000)的字符串n表示假密码。
输出格式:一行一个字符串表示真密码字符串。

//
// Created by abner on 2023/11/8.
//
#include <bits/stdc++.h>
using namespace std;
int main(){
    string s,s2;
    cin >>s;
    int len = s.length();
    if(len%2){
        cout<<123456;
        return 0;}
        for (int i = 1;i <= len / 2;i++)
        s2+=s[i-1];
        for (int i = len;i>len / 2;i--)
        s2+=s[i-1];
        cout <<s2;
        return 0;
    }

找鸭子


难度:青铜
时间限制:1秒
巴占用内存:64M
小码哥在家里养了很多鸭子,过年的时候想在家里把家里年龄最大的鸭子做成除夕夜的一道菜,所
以他把鸭子按照年龄标记为大写字母A-Z,A表示年龄最小,Z表示年龄最大,如家里的鸭子标记成
了AAAABBCCC表示家里养了9只鸭子,其中年龄为A的鸭子为4只,年龄为B的鸭子有2只,年龄为C
的鸭子有3只,年龄为C的鸭子年龄最大,可以作为年夜菜,但是请注意,标记好的鸭子可能会跑掉
找不到了,所以可能不是连续的字符串。在个鸭子中,你能帮他找到年龄最大的鸭子的年龄
吗?
格式
输入格式:一行一个长度为n(1≤n≤100000)的鸭子年龄字符串,注意不一定是连续的
字符串(字母在字母表中相邻为连续的字符串,如ABC算是连续字符串,BAC则
不是连续字符串)。
输出格式:一行一个字符表示最大鸭子年龄。

//
// Created by abner on 2023/11/8.
//
#include <bits/stdc++.h>
using namespace std;
int main() {
    string s;
    char ch = 'A';
    cin >> s;
    for (int i = 0; i < s.length(); i++){
        if (s[i] > ch)
            ch = s[i];
}
    cout<<ch;
    return 0;
}

银河间的数字之战


难度:青铜
①时间限制:1秒
巴占用内存:256M
在一个遥远的银河,两个星球:
A星和
B星因为争夺资源而产生了矛盾。这两个星球都有强大
的能量,这种能量可以量化为一个整数。
A星的能量为整数a,
B星的能量为整数b,整数
的绝对值不超过105。但这两个星球很特别,它们不通过战争解决矛盾,而是通过数字之战。
数字之战
的规则非常简单:两个星球直接相互接触,将他们的能量合并,生成一个新的整数,这
个新的整数就是他们的合力。但要注意,星球的能量可能是负的!
作为银河的和平使者,你被委派去计算他们的合力是多少,从而为两个星球制定一个和平方案。请
你帮助它们计算出合力的数值。
格式
输入格式:一行,输入两个整数α,b(a,b≤105),表示A星和B星的能量。
输出格式:一个整数,表示他们的合力。

//
// Created by abner on 2023/11/8.
//
#include <bits/stdc++.h>
using namespace std;
int main() {
    int a, b;
    cin >> a >> b;
    cout << a + b;
    return 0;
}

变了吗,一切好像又没有变

小码哥的英语


号难度:白银
①时间限制:1秒
巴占用内存:256M
小码哥在做英语单选题的时候突然想到了一个很有意思的问题:单选题的答案都是A或者B,那么很
多道题目的答案组成的就是一个A和B组成的字符串。如果两个相邻的题目的答案是相同的,小码哥
就可以修改这两个题目的答案,改成都是A、都是B或者一个是A另外一个是B,小码哥把这个定义
为一次操作。那么对于任意一个答案字符串,最少需要多少次操作,才能使得它满足:任意相邻的
题目的答案都不同。
格式
输入格式:第一行包含一个数字n(1≤n≤1000),表示字符串的个数:
后面的n行,每一行表示一个长度为L(1≤L≤10000)的,由字符A和B随
机组成的字符串。
输出格式:输出有多行,每一行表示对应字符串需要的最少的操作次数T(0≤T≤10000

//
// Created by abner on 2023/11/8.
//
#include <bits/stdc++.h>
using namespace std;
int n;
string s;
int main(){
cin >>n;
while (n--){
cin >>s;
int len = s.length(),ans =0;
for (int i=0;i<len;i++){
if(i%2==0 && s[i]=='B')
ans++;
if(i%2==1 && s[i]=='A')
ans++;
}
        ans = min(ans,len - ans);
cout <<ans <<endl;
}
return 0;
}

小码哥的艰难选择


号难度:白银
①时间限制:1秒
巴占用内存:512M
小码哥养了很多花,这些花每天都需要大量的肥料,现在小码哥提供不起这么多肥料了,他决定从
所有的花里面挑选一个淘汰,规则如下:
每一个花的初始分数是1880分:
在总共(1≤n≤100)个回合里,每一个回合,小码哥会随机给一个花对应的分数(可正可
负),需要加在鲜花的当前分数上。
最后谁的分数最少则淘汰谁,如果出现两个分数一样的,则淘汰掉最先获得这个分数的。
格式
输入格式:第一行包含整数n(1≤n≤100),表示回合数。
第2~十1行,按照时间顺序输入花的名字和得分(空格隔开)
的信息,其
中名称是长度为L(1≤工≤20)的英语小写字母组成的字符串,分数的绝对值不
大于10000。

//
// Created by abner on 2023/11/8.
//
#include <bits/stdc++.h>
using namespace std;
int n,ansScore = 0x3f3f3f3f;
string ansName;
map<string,bool>m1;
map<string,int>m2,m3;
map<string,int>::iterator it;
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        string flower;
        int score;
        cin >> flower >> score;
        if (!m1[flower]) {
            m1[flower] = true;
            m2[flower] = 1000 + score;
        } else
            m2[flower] += score;
        m3[flower] = i;
    }
    for (it = m2.begin(); it != m2.end(); it++)
        ansScore = min(ansScore, it->second);
    int index = 0x3f3f3f3f;
    for (it = m2.begin(); it != m2.end(); it++)
        if (it->second == ansScore)
            if (m3[it->first] < index) {
                index = m3[it->first];
                ansName = it->first;
            }
    cout << ansName << endl << ansScore;
    return 0;
}

小码哥搭建花圃


难度:白银○
时间限制:1秒
巴占用内存:256M
小码哥准备搭建一个花圃,现在他的手里有五段长度为正整数的围栏,他想知道,这五段围栏中,
是否存在四段可以构成一个正方形,或者一个矩形(此处特指长度和宽度不同的矩形),或者不存
在。
请你帮助他计算下。
格式
输入格式:输入的第一行包含四个空格分隔的正整数,数字的范围是1到100000(两边都是
闭区间),表示五段围栏的长度。
输出格式:如果存在四段组成正方形,则输出“Square”。
如果存在四段组成矩形,则输出"Rectangle”。
否则输出“No

//
// Created by abner on 2023/11/8.
//
#include <bits/stdc++.h>
using namespace std;
int main() {
    map<int, int> m1;
    map<int, int>::iterator it;
    int length;
    for (int i = 1; i <= 5; i++) {
        cin >> length;
        m1[length]++;
    }
    int flag = 0;
    for (it = m1.begin(); it != m1.end(); it++) {
        if (it->second == 2)
            flag++;
        if (it->second >= 4) {
            cout << "Square";
            return 0;
        }
        if (flag == 2) {
            cout << "Rectangle";
            return 0;
        }
    }
    cout << "No";
    return 0;
}

科学记数法


难度:白银
0时间限制:1秒
巴占用内存:512M
科学记数法是一种记数的方法。把一个数x表示成a与1的b次幂相乘的形式,如a×10
(1≤|a<10,a不为分数形式,b为整数),这种记数法叫做科学记数法,可简写为aEb。比
如:对于数12580000使用科学记数法表示为:1.258E7
现在需要你将给定的一个it范围内的正数x通过科学记数法表示出来,注意:如果b=0,则
Eb无需输出,仅输出a即可。
特别说明的是,类似于1©这种数字,最终的结果应该是1E2。即如果a是一个小数位(小数位指的
是.符号后面的所有位)全部为的小数,我们a的整数形式去表示。
格式
输入格式:输入一个int范围内的正数x,即0<x≤231一1。
输出格式:打印唯一的一行,即给定数字心的”科学记数法”。

//
// Created by abner on 2023/11/8.
//
#include <bits/stdc++.h>
using namespace std;
string x,ans;
int main(){
cin >>x;
if (x.length()==1) {
    cout << x;
    return 0;
}
ans = ans + x[0]+'.'+x.substr(1);
int i = ans.length()-1;
while (ans[i]=='0')
i--;
if(i==1)
i=0;
for (int j=0;j <=i;j++)
cout <<ans[j];
cout <<"E"<<x.length()-1;
return 0;
}

我们会遇见什么样的人,取决于我们是什么样的人

世界警察


难度:黄金
0时间限制:4秒
巴占用内存:1024M
世界警察小码哥来谈判了,恐怖分子在银行挟持了个人质,每个人质都所属一个国家,第
个人质所属的国家为℃:,人质排成了一排,位置都是固定的。经过商讨,恐怖分子允许小码哥可
以带走任意一段连续区间内的人质。但是上级要求小码哥,最好每个国家的人质都带回来一个,不
希望人质中有重复的国家。请问小码哥最多可以带出来多少人质。
格式
输入格试:第一行一个正整数n,表示共有n个人质:
第二行共有个正整数,第i个正整数表示第i个人质的所属国家℃:。
输出格式:一个整数表示小码哥最多可以带出来的人质数。

//
// Created by abner on 2023/11/8.
//
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 +7;
int n,a[N],ans,num;
map<int,int>mp;
int main(){
cin >>n;
for (int i=1;i <n;++i)
cin >>a[i];
int l=1,r=1;
while (l<=r && r<=n){
if (!mp[a[r]]) {
    mp[a[r]]++, r++, num++;
    ans = max(ans, num);
}else{
while (a[l] != a[r])
    mp[a[l]]--,l++,num--;
mp[a[l]]--,l++,num--;
}
}
cout <<ans;
return 0;
}

中转站


号难度:黄金0时间限制:1秒
巴占用内存:256M
物流业为了降低物流成本,提高物流效率,运输过程中通常不会由始发地直达目的地,而是经由多
个中转站中转,最终到达目的地。最常见的便是快递业,由于中转站有很多,要想将所有中转站两
两互通代价过高,因此每个中转站只会与个别中转站单向或双向连通。
在接受订单时,为了判断该物件能否送达,会先查询本站是否能直接送达目的地站点;若不能,则
递归查询本站可达中转站,以及中转站的中转站能否送达,直至找出目的地或找遍全部中转站。
小码哥去快递点实习的第一天就遇到了问题,系统因不明原因无法正常判断物件能否送达,好在整
个物流网的中转站信息均可访问,小码哥便决定自己设计一个程序临时急用。
格式
输入格式:第一行输入两个正整数几,m,n是整个物流网所有中转站的数目,小码哥所
在的站点是1号,目的地的站点是n号:
接下来的m行,每行输入两个正整数x,y,代表中转站x可以送往中转站

//
// Created by abner on 2023/11/8.
//
#include <bits/stdc++.h>
using namespace std;
const int N = 507;
int n,m,x,y,mp[N][N];
bool vis[N],flag;
void dfs(int num){
    if (num == n){
        flag = true;
    return;
}
for(int i=2;i<=n;i++){
if (!vis[i] && num !=i&&mp[num][i]) {
    vis[i] = true;
    dfs(i);
}}}

int main(){
    cin >>n >>m;
    int x,y;
    for (int i=1;i<=m;i++) {
        cin >> x >> y;
        mp[x][y] = 1;
    }
    dfs(1);
    if(flag)
    cout <<"Yes";
    else
    cout <<"No";
    return 0;
}

安全验证


难度:钻石
0时间限制:1秒
巴占用内存:256M
小码哥是一名密码学专家,一天他的朋友拜托他设计一个简单的标识验证程序,用于服务器安全验
证。
小码哥答应了朋友的请求,设计了一个简单的标识验证方法。服务器会自带一个安全标识串S,
每隔一段时间会自动更新,客户端的每次请求都会先收到服务器的标识串,然后在下一次更新前需
要找出S中的一个真子串T,满足既是S的前后缀,又在S中出现至少一次的最长
串,找到后才能正常与服务器交互。
小码哥虽然精通密码学,但对开发一窍不通,于是找到了你,希望你能协助他完成程序开发环节。
格式
输入格式:一个字符串S,全部是小写字母。
输出格式:满足条件的最长直子串T,如果没有就输出”No”

//
// Created by abner on 2023/11/8.
//
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 +7;
int len,pi[N];
char s1[N],s2[N],s3 [N];

void prefix_function(char *s,int len){
    for (int i=1;i<len;i++) {
        int j = pi[i - 1];
        while (j > 0 && s[i] != s[j])
            j = pi[j - 1];
        if (s[i] == s[j])
            j++;
        pi[i] = j;
    }}
int main(){
    cin >>s1;
    len = strlen(s1);
    strcpy(s2,s1 + 1);
    s2[strlen(s2)-1]='\0';
    prefix_function(s1,len);

    int temp = pi[len - 1];
    while (temp){
        strncpy(s3,s1,temp);
        s3[temp]='\0';
        if (strstr(s2,s3)) {
            cout << s3;
            return 0;
        }
        temp = pi[temp -1];
    }
    cout <<"No";
    return 0;
}

旅行


难度:钻石
①时间限制:1秒
巴占用内存:256M
假期快要结束了,小码哥还没有好好放松一下,便决定四处转转。小码哥所在的地方有N个景点
和M条有向道路连接这些景点。景点从1到N编号,道路从1到M编号,第1条道路连接
景点U和V,这意味着小码哥可以从景点U走到景点V。
小码哥想到每个景点都看一看,他可以随意选择一个景点作为起点,并随意选择另一个景点作为终
点。为了更好的欣赏沿途风景,小码哥决定制定一个计划,使他能够恰好只到每个景点一次并恰好
只经过每条道路一次。现在给你所有景点和道路的信息。请告诉小码哥是否存在一种方法可以满足
他的计划。
如果只有一个景点,则小码哥可以直接去这个景点,我们认为这种情况也是满足小码哥的计划的。
格式
输入格式:第一行包含一个整数T,表示测试用例的数量,
对于每个测试用例,第一行包含两个整数N和M,其中N是景点的数量,M是

//
// Created by abner on 2023/11/8.
//
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 +7;
int T,n,m;//n个节点,m条边
struct NODE {
    int in, out;
}graph[N];
int fa[N];
void init(int n)//初始化
{
    for (int i=1;i <= n;i++)
        fa[i]=i,graph[i].in = graph[i].out = 0;
}
int find(int x)//查找,带路径压缩
{
    return x ==fa[x] ?x : (fa[x] = find(fa[x]));
}
void merge(int i,int j)//合并
{
int x = find(i),y = find(j);
if (x != y)
fa[x] = y;
}

bool connect(int n) {//判断所有点是否连通
    int tmp = find(1);
    for (int i = 2; i <= n; i++) {
        if (find(i) != tmp)
            return false;
    }
    return true;
}
    int main() {
        cin >> T;
        for (int i = 1; i <= T; i++) {
            cin >> n >> m;
            if (n == 1) {
                cout << "YES" << endl;
                continue;
            }
            init(n);
            int u, v;//u指向v的路径
            for (int j = 1; j <= m; j++) {
                cin >> u >> v;
                graph[u].out++;
                graph[v].in++;
                merge(u, v);
            }
            int sum1 = 0, sum2 = 0, sum3 = 0;//sum1多少个点出度为1,入度为1
            //sum2多少个点出度为1,入度为0
            //sum3多少个点出度为0,入度为1
            for (int j = 1; j <= n; j++) {
                if (graph[j].out == 1 && graph[j].in == 1)
                    sum1++;
                if (graph[j].out == 1 && graph[j].in == 0)
                    sum2++;
                if (graph[j].out == 0 & graph[j].in == 1)
                    sum3++;
            }
            if (sum1 == n - 2 && sum2 == 1 && sum3 == 1 && connect(n))
                cout << "YES" << endl;
            else
                cout << "NO" << endl;
        }
        return 0;
    }
            

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
循环比日程表是一种常见的算法问题,可以使用递归或迭代的方式来生成日程表。下面是一个使用C++编写的循环比日程表的示例代码: ```cpp #include <iostream> #include <vector> using namespace std; void generateSchedule(int teams) { if (teams % 2 != 0) { teams++; // 如果队伍数为奇数,添加一个虚拟队伍 } int rounds = teams - 1; // 总轮次数 int matches = teams / 2; // 每轮的比场次 vector<vector<int>> schedule(rounds, vector<int>(matches)); // 初始化第一轮的比安排 for (int i = 0; i < matches; i++) { schedule[0][i] = i + 1; } // 生成后续轮次的比安排 for (int round = 1; round < rounds; round++) { for (int match = 0; match < matches; match++) { int team1 = schedule[round - 1][match]; int team2; // 计算每个队伍的对手 if (match == 0) { team2 = teams - 1; } else { team2 = schedule[round - 1][match - 1]; } // 考虑虚拟队伍的情况 if (team1 == teams - 1 || team2 == teams - 1) { team1 = (team1 + 1) % (teams - 1); team2 = (team2 + 1) % (teams - 1); } schedule[round][match] = team2; } } // 打印比日程表 for (int round = 0; round < rounds; round++) { cout << "Round " << round + 1 << ": "; for (int match = 0; match < matches; match++) { cout << schedule[round][match] << " vs " << teams - schedule[round][match] - 1 << " "; } cout << endl; } } int main() { int teams; cout << "Enter the number of teams: "; cin >> teams; generateSchedule(teams); return 0; } ``` 这段代码中,我们首先根据输入的队伍数计算总轮次数和每轮的比场次。然后,使用一个二维向量 `schedule` 来存储比安排。我们从第一轮开始,逐轮生成比对阵,并将结果存储在 `schedule` 中。最后,打印出比日程表。 希望这个示例代码对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值