当前位置: 首页 > news >正文

算法沉淀第六天(牛客小白月赛122 和 Codeforces Round 1059 (Div. 3))

目录

引言:

牛客小白月赛122

大话骰子

        题目分析

        逻辑梳理

        代码实现

max-mid

        题目分析

        逻辑梳理

        代码实现

糟糕的手法

        题意分析

        逻辑梳理

        代码实现

x_to_y_2

        题意分析

        逻辑梳理

        代码实现

Codeforces Round 1059 (Div. 3)

Beautiful Average

        题意分析

        逻辑梳理

        代码实现

Beautiful String

        题意分析

        逻辑梳理

        代码实现

Beautiful XOR

        题意分析

        逻辑梳理

        代码实现

结语:


引言:

        今天是算法沉淀的第六天,今天我们不寻找算法题来打,我们来讲解一下昨天打的牛客小白月赛122和CF的div3。昨天本来想冲击cf1200的,结果第二题题目看半天没看懂,哭死,掉大分了,战绩如下图

        那么,我们今天就来讲讲这俩道题,话不多说,我们就进入今天的算法讲解———————>

                  


牛客小白月赛122

        因为小白月赛比cf的题简单,所以我们先讲小白月赛的题

大话骰子

        按照惯例,我们先看题目

        题目分析

        这是该题链接A-大话骰子_牛客小白月赛122

        不想跳转可看下图

        这题的题目意思很简单,就是有12个骰子,然后每个骰子有一个点数,然后输入俩个数x和y,如果12个骰子里,点数为y的骰子数量<x,就输出win,否则就输出lose

        这题的题目就这么简单,那么我们进入逻辑梳理环节


        逻辑梳理

        这题就纯签到了,直接统计每个点数的骰子个数,然后判断一下就可以了


        代码实现

        这里就直接放代码啦

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;int t;void solve()
{int a[10] = { 0 };int k;for (int i = 1; i <= 12; i++){cin >> k;a[k]++;}int x, y;cin >> x >> y;if (a[y] < x)cout << "win" << endl;elsecout << "lose" << endl;
}int main()
{cin >> t;while(t--){solve();}return 0;
}

        那么,这题就讲解完啦


max-mid

        题目分析

        这是该题链接B-max-mid_牛客小白月赛122

        不想跳转可看下图

        这题就是告诉你有n个物品,然后每个物品的价值不是0就是1,随后,要从这些物品里面选出k个物品,使得Max-Mid的值最小,问你最小值是多少

        Max就是选的数里的最大值

        Mid就是选的数里的中位数


        逻辑梳理

        这题已经告诉了我们中位数的值是一个从小到大排序后的第(n+1)/2向下取整的位置的值

        所以,我们可以对数组先进行排序

        然后我们对排序后的数组进行操作

        首先如果取的物品可以全是0,就全取0,这样Max和Mid都是0,结果自然是0

        若取的物品里一定有1,那就从后往前取k个数,然后再算出Mid的值,然后用1减去这个Mid就可以啦

        那么,逻辑就梳理完啦,接下来我们就进入代码实现环节


        代码实现

        这里就直接放AC码啦

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;int t;
int a[1010];void solve()
{int n, k;cin >> n >> k;for (int i = 1; i <= n; i++)cin >> a[i];sort(a + 1, a + n + 1);if (a[k] == 0)cout << 0 << endl;else{int l = n - k;cout << 1 - a[l + (k + 1) / 2] << endl;}
}int main()
{cin >> t;while(t--){solve();}return 0;
}

        这题就讲解完啦


糟糕的手法

        题意分析

        题目链接在这C-糟糕的手法_牛客小白月赛122

        不想跳转的可看下图

        这题的意思很简单,就是给你一串数组,然后每次操作可以选择俩个下标i和j,然后将下标i对应的元素赋值为下标i的元素乘上下标j的元素

        然后问你最少进行多少次操作可以让数组中正数的元素个数到达m个

        如果达不到m个正数,就输出-1

        那么题目分析完了,我们进入逻辑梳理环节


        逻辑梳理

        首先,放进数组中的元素分三种,一种是正数,一种是负数,一种是零

        我们可以统计正数的个数,负数的个数,和零的个数

        接下来,我们分情况讨论就可以了

        先初步分为五种情况

        1.全是正数

        这种情况下,如果m的个数不是数组元素的个数就输出-1

        如果m的个数是数组元素的个数,就输出0

        因为全是正数了,怎么变也变不出什么东西

        2.有正数,有零

        这种情况下如果m比正数的个数多,就输出-1

        如果m的正数比正数的个数少,就输出差值的绝对值就可以了,因为想让正数的个数变少,直接正数和0相乘就可以了

        3.有正数,有负数,也有零

        只看正数和负数的个数,m的可承受范围是在0到正数的个数+负数的个数-1,因为负数可以和负数乘变成正数,但如果只剩一个负数了,那就不能再变成正数了,在范围内的话算差值就可以了

        4.有负数,有零 和 全是负数

        这种情况最多能变出的正数就是负数的个数-1,在范围内就算差值就可以了

        5.有正数,有负数

        这种的范围就是正数的个数到正数+负数-1的范围了,因为没有0可以用来削减正数的个数了,只能增加了,同理,也是算差值就可以了

        那么所有情况都分析完啦,接下来,我们就进入代码实现环节


        代码实现

        这里就直接放AC码啦

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;int t;
long long a[100010];void solve()
{int n, m;int ling = 0;cin >> n >> m;for (int i = 1; i <= n; i++){cin >> a[i];if (a[i] == 0)ling++;}sort(a + 1, a + n + 1);int zheng = 0;for (int i = 1; i <= n; i++){if (a[i] > 0){zheng = i;break;}}if (zheng == 0)zheng = n + 1;if (zheng == 1){if (m != n)cout << "-1" << endl;elsecout << "0" << endl;}else if (a[1] == 0){if (m > n - ling)cout << "-1" << endl;elsecout << n - ling - m << endl;}else{if (m >= n - ling)cout << "-1" << endl;else{int zhengshu = n - zheng + 1;cout << abs(m - zhengshu) << endl;}}
}int main()
{cin >> t;while(t--){solve();}return 0;
}

x_to_y_2

        题意分析

        题目链接在这D-x_to_y_2_牛客小白月赛122

        不想跳转的可看下图

        这题的意思就很简单,给你一个数x,让你把x变成y,问你要最少要进行几次操作

        每次操作有俩种选择

        1.x/2向下取整

        2.选择一个任意的数z,然后x=x|z

        题目就这么简单,那么,我们就进入逻辑梳理环节


        逻辑梳理

        这题其实很简单,因为是或上一个数,所以是有1出1

        那么,x的二进制上所有的1所对应的y位置上的那个二进制也必须是1,不然或上就不可能会得到x

        所以只需要一直对x进行1的操作,然后判断x是不是所有的1的位置,在y那也是1,如果这个条件满足了,就判断这俩个数是不是相等的,如果相等,就不用或了,直接输出次数就可以了,如果不相等,就次数再加一就可以了

        那么,这题的逻辑就梳理完了,接下来就进入代码实现部分


        代码实现

        这里就直接放AC码啦

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;int t;void solve()
{long long  x, y;long long ans = 0;cin >> x >> y;if (x == y)cout << 0 << endl;else{while ((x & y) != x){ans++;x /= 2;}if ((x & y) != y)ans++;cout << ans << endl;}
}int main()
{cin >> t;while(t--){solve();}return 0;
}

        那么到此,牛客小白月赛的题就讲解完啦,接下来,我们来讲CF的题


Codeforces Round 1059 (Div. 3)

Beautiful Average

        题意分析

        这是题目链接Problem - A - Codeforces

        不想跳转的可看下图

        这题看着很长,其实就是给你一个数组,然后问你所有子数组中最大的平均值是多少,然后输出就好了


        逻辑梳理

        既然是找最大平均值,那直接找最大的那个值就可以了,那么这题就过了 


        代码实现

        这里就直接放AC码啦

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;int t;void solve()
{int n;int ma = 0;cin >> n;for (int i = 1; i <= n; i++){int k;cin >> k;ma = max(ma, k);}cout << ma << endl;
}int main()
{cin >> t;while (t--)solve();return 0;
}

Beautiful String

        题意分析

        题目链接在这Problem - B - Codeforces

        不想跳转的可看下图

        这题题目很长,但其实就是给你一个只有0和1作为元素的字符串,然后你可以删掉一个不递减的子串,然后剩余的字符串需要是回文串

        如果可以变成回文串,就输出删除的子串的长度和下标,下标从小到大输出

        如果不可以就输出-1


        逻辑梳理

        其实这道题根本就不存在-1的情况,因为这个字符串只有俩个元素,所以只需要把一种元素删完,留另一种元素就可以了,那剩下的字符串肯定是回文串了

        那么逻辑梳理完我们来看代码


        代码实现       

        这里就直接放AC码啦

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;int t;void solve()
{int n;cin >> n;string a;cin >> a;vector<int>b;for (int i = 0; i < a.size(); i++){if (a[i] == '0')b.push_back(i);}cout << b.size() << endl;for (int i = 0; i < b.size(); i++)cout << b[i]+1 << " ";cout << endl;
}int main()
{cin >> t;while (t--)solve();return 0;
}

Beautiful XOR

        题意分析

        这是题目链接Problem - C - Codeforces

        不想跳转的可看下图

        这题的意思也很简单,就是给你俩个数a和b,问你能不能通过有限次操作将a变成b

        每次操作分为俩部

        1.选择一个不大于当前a的一个数

        2.将a与这个数异或得到一个新的数

        如果可以通过有限次操作将a变成b,就输出操作次数,和每次操作需要异或的数

        如果不可以就输出-1

        这题题目就分析完啦,接下来进入逻辑梳理环节


        逻辑梳理

        因为是异或嘛,并且选的数是不大于当前a的数

        所以我们可以先将a和另一个数异或,得到a的最高位为1,且下面位也全为1的一个数

        我们假设这个数位z,然后将z和b进行比较

        如果b比z大,就输出-1,因为z已经是我们通过操作所能得到的最大的数了

        如果b和z一样大,就输出1,然后再输出异或的那个值

        如果b比z小,就输出2,先输出一开始异或的那个值,再输出z-b就可以了,因为z和z-b异或就能得到b了

        那么,逻辑就梳理完啦,接下来进入代码实现环节


        代码实现

        这里就直接放AC源码啦

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
using namespace std;int t;void solve()
{long long a, b;cin >> a >> b;if (a == b)cout << "0" << endl;else{int wei = 0;for (int i = 0; i < 50; i++){if (pow(2, i) > a){wei = i - 1;break;}}long long ll = 0;for (int i = 0; i <= wei; i++){ll += pow(2, i);}if (ll < b){cout << "-1" << endl;return;}else if (ll == b){cout << "1" << endl;cout << ll - a << endl;}else{cout << "2" << endl;cout << ll - a << " " << ll - b << endl;}}
}int main()
{cin >> t;while (t--)solve();return 0;
}

        好啦,CF的题也讲完啦


结语:

        今日算法讲解到此结束啦,希望对你们有所帮助,谢谢观看,如果觉得不错可以分享给朋友哟。有什么看不懂的可以评论问哦,

http://www.dtcms.com/a/500218.html

相关文章:

  • 网站建设与维护蒋勇从前端开发培训机构有哪些
  • 网站建设后的心得浙江省建设通网站
  • Git的多人协作
  • 成都开发网站建设怎么下载应用商店
  • 14-哈希SHA1案例:宝钢
  • Python数据分析:小实例,数人头
  • 单页面网站怎么做软件项目开发文档模板
  • 松岗营销型网站建设软文范例大全
  • 本地网站建设方案信息大全网站数据迁移教程
  • 麦肯锡:从「AI价值悖论」到代理式 AI 的产业化落地
  • 金华市建设技工学校教育培训网站什么是网站建设整体策划方案
  • C++动态规划入门指南——助力CSP竞赛夺冠(加强版)
  • 【前端高级特效】使用 CSS 实现毛玻璃模糊背景效果(含完整源码讲解)
  • 网站备案花钱么培训学校网站
  • 【人工智能系列:机器学习学习和进阶01】机器学习初学者指南:理解核心算法与应用
  • 利用舵机实现机器人行走
  • 做网站时需要FTP工具吗济南市工程造价信息网
  • 电商网站的特点wordpress投稿者发附件
  • CSDN:打造专业的技术名片
  • pveproxy 无响应不能访问web
  • 我怎么做个人网站做网站用html还是jsp
  • 做营销的一般逛哪些网站新网域名注册查询
  • 数据库设计原则
  • php网站开发工资网站免费建站系统
  • 大气 网站模板做网站需要多少
  • 使用MLflow跟踪和管理你的机器学习实验
  • 周村网站制作首选公司湘潭网站建设选择湘潭振企网站建设
  • 建设网站范文上海的公司排行榜
  • 移动网站开发入门网站防红链接怎么做
  • 芋道字段级权限扩展