The 10th Shandong Provincial Collegiate Programming Contest

news/2024/10/6 22:53:32/文章来源:https://www.cnblogs.com/Seii/p/18449231


A - Sekiro

题意

初始有\(n\)个金币,死了\(m\)次,死一次\(n = \lceil \frac n 2 \rceil\)。求最后的金币数。

思路

模拟。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long longvoid solve()
{int n, m;cin >> n >> m;while (m-- && n > 1){n = (n + 1) >> 1;}cout << n << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;cin >> T;while (T--){solve();}return 0;
}

B - Median

题意

\(n\)个数(\(n\)是奇数),\(m\)对关系(\(u v\)表示\(u > v\)),对于第\(i\)个元素,给每个元素赋值,能使它成为中位数就输出\(1\),否则输出\(0\)

思路

一条关系可以看作一条有向边,由大的指向小的,得到一张有向图,先判断有无环,有环说明情况不存在全为\(0\),可用\(bfs\)\(dfs\)判断,同时记录该点的前继和后继,若该点为中位数,说明该点的前继和后继都不超过\(\frac n 2\)

代码

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long longconst int mxn = 110;int n, m, cnt;
vector<int>g1[mxn], g2[mxn];
int up[mxn], low[mxn], deg[mxn], vis[mxn];void dfs1(int u, int fa) 
{vis[u] = 1;for (auto v : g2[u]) {if (!vis[v]) {cnt++;dfs1(v, u);}}
}void dfs2(int u, int fa) 
{vis[u] = 1;for (auto v : g1[u]){if (!vis[v]){cnt++;dfs2(v, u);}}
}bool topo() {cnt = 0;queue<int>q;for (int i = 1; i <= n; i++) {if (deg[i] == 0){q.push(i);}}while (!q.empty()) {int u = q.front();q.pop();cnt++;for (auto v : g1[u]){if (--deg[v] == 0){q.push(v);}}}return cnt == n;
}void init() 
{for (int i = 1; i <= n; i++) {g1[i].clear();g2[i].clear();deg[i] = 0;up[i] = 0;low[i] = 0;}
}void solve()
{cin >> n >> m;init();for (int i = 1; i <= m; i++) {int u, v;cin >> u >> v;g1[u].push_back(v);g2[v].push_back(u);deg[v]++;}if (!topo()) {for (int i = 1; i <= n; i++) {putchar('0');}putchar('\n');return;}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++){vis[j] = 0;}cnt = 0;dfs1(i, -1);up[i] = cnt;for (int j = 1; j <= n; j++) {vis[j] = 0;}cnt = 0;dfs2(i, -1);low[i] = cnt;}for (int i = 1; i <= n; i++) {if (up[i] < (n + 1) / 2 && low[i] < (n + 1) / 2) {putchar('1');}else {putchar('0');}}putchar('\n');
}signed main() 
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int T;cin >> T;while (T--){solve();}return 0;
}

C - Tokens on the Segments

题意

\(n\)条线段,其中第\(i\)段的端点是\((l_i, i)\)\((r_i, i)\),在平面的整数点放标记,但是标记的\(x\)坐标必须彼此不同。问最多有多少条线段上有标记。

思路

按如下方法将线段存入小根堆:左端点靠前的在前,左端点一样的,右端点靠前的在前。从最左边的线段的左端点开始计数,用指针记录当前位置。指针右移,同时更新其他线段的左端点(因为标记的\(x\)不能相同),到新的线段就\(ans++\),当前位置没有线段就直接移动到下一条线段。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long longstruct edge
{int l, r;bool operator < (const edge& a) const{if (l == a.l){return r > a.r;}return l > a.l;}
};void solve()
{int n;cin >> n;priority_queue<edge, vector<edge>> q; // 小根堆for (int i = 0; i < n; i++){int l, r;cin >> l >> r;q.push({ l,r });}int now = 1, ans = 0; // 当前可以标记的位置while (!q.empty()){int l = q.top().l;int r = q.top().r;q.pop();if (r >= now) // 右端点>=now就可以标记,且尽量往左标—,所以要更新左端点{ans++;if (l < now) // 标记处在线段左边(与上一条之间有空){now = l + 1;}else{now++;}}while (q.size() && q.top().l == l) // 更新左端点{edge t = q.top();q.pop();t.l++; // 前推1if (t.l <= t.r) // 仍然是线段(或者点){q.push(t);}}}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;cin >> T;while (T--){solve();}return 0;
}

D - Stones in the Bucket

题意

\(n\)个桶,第\(i\)个桶里有\(a_i\)个石头。两种操作:从非空同种一走一个石头、把一个桶里的石头移到另一个桶里。问使得所有桶里石头数相同所需的最小操作数。

思路

模拟。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long longvoid solve()
{int n, sum = 0;cin >> n;vector<int> v(n);for (int i = 0; i < n; i++){cin >> v[i];sum += v[i];}if (n == 1){cout << 0 << endl;return;}int ans = sum % n; // 剩下的sum /= n; // 平均分for (int i = 0; i < n; i++){if (v[i] != sum && v[i] < sum) // 少的多的看一半就行{ans += (sum - v[i]);}}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;cin >> T;while (T--){solve();}return 0;
}

E - BaoBao Loves Reading

题意

思路

代码

点击查看代码


F - Game on a Graph

题意

给定\(n\)个顶点\(m\)条边的简单连通图,\(k\)个人已知分队,轮流删边,使得图不连通的队伍输。两个队伍用最佳策略游戏,问哪队赢。

思路

连通图至少有\(n-1\)条边,也就是说谁能删\(m-(n-1)\)条边。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long longvoid solve()
{int n, m, k;string s;cin >> k >> s >> n >> m;for (int i = 0; i < m; i++){int u, v;cin >> u >> v;}int idx = (m - n + 1) % k;cout << (s[idx] == '1' ? '2' : '1') << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;cin >> T;while (T--){solve();}return 0;
}

B - Median

题意

思路

代码

点击查看代码


H - Wandering Robot

题意

一个在\((0,0)\)机器人每次能够上/下/左/右移动一个单位,用\(U/D/L/R\)表示。已知长度为\(n\)的操作序列,以及重复操作了\(k\)次,求移动过程中机器人到点\((0,0)\)的曼哈顿距离的最大值。
曼哈顿距离:\(|x1−x2|+|y1−y2|\)

思路

答案一定在第一次操作或第\(k\)次操作中,因为如果第一轮结束导致答案增大,那就会一直增大直至第\(k\)次操作结束;如果减小,之后也会一直减小。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long longint n, k;
string cmd;void move(int& x, int& y, int& ans)
{for (int i = 0; i < n; i++){switch (cmd[i]){case 'U':y++;break;case 'D':y--;break;case 'L':x--;break;case 'R':x++;break;default:break;}ans = max(ans, abs(x) + abs(y));}
}void solve()
{cin >> n >> k >> cmd;int x = 0, y = 0, ans = 0;move(x, y, ans);int kx = (k - 1) * x, ky = (k - 1) * y; // (k - 1)次操作后的坐标move(kx, ky, ans);cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;cin >> T;while (T--){solve();}return 0;
}

K - Happy Equation

题意

思路

代码

点击查看代码


M - Calandar

题意

定义一年有\(12\)个月,每月\(30\)天,每周\(5\)天(周五之后是周一)。已知今天是\(y_1\)\(m_1\)\(d_1\)日和周几,求\(y_2\)\(m_2\)\(d_2\)日是周几。

思路

算日期差值后取模即可。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long longstring week[] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };void solve()
{int y1, y2, m1, m2, d1, d2;string w;cin >> y1 >> m1 >> d1 >> w >> y2 >> m2 >> d2;int num1 = y1 * 12 * 30 + m1 * 30 + d1;int num2 = y2 * 12 * 30 + m2 * 30 + d2;int dt = (num2 - num1) % 5;int id = 0;for (int i = 0; i < 5; i++){if (w == week[i]){id = i;break;}}cout << week[(id + dt + 5) % 5] << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;cin >> T;while (T--){solve();}return 0;
}


比赛链接 <>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809253.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打开网页显示数据库连接出错

当打开网页时出现“数据库连接出错”的提示,通常意味着网站后端尝试与数据库建立连接时遇到了问题。这可能是由以下几个原因造成的:数据库服务器未启动:确保数据库服务正在运行。 网络问题:检查数据库服务器和应用服务器之间的网络连接是否正常。 配置错误:确认应用程序中…

Navicat连接数据库遭遇1045错误:如何解决及预防措施

遇到 Navicat 连接 MySQL 数据库时出现 1045 错误(访问被拒绝,用户名或密码错误),可以通过以下几个步骤来解决和预防这个问题: 解决方法确认用户名和密码确认在 Navicat 中输入的用户名和密码是否正确。 可以尝试在 MySQL 命令行中验证用户名和密码是否正确。重置密码如果…

连接数据库1045错误

遇到 MySQL 的 1045 错误,通常表示“访问被拒绝,用户名或密码错误”。以下是解决此问题的步骤: 1. 确认用户名和密码检查用户名和密码是否正确:确认登录数据库时使用的用户名和密码是否正确无误。 如果不确定密码,可以尝试重置密码。2. 重置密码通过命令行重置密码:如果忘…

打不开网站并提示网站还原错误如何处理

当遇到“网站还原错误”导致无法打开网站时,可以尝试以下几种方法来解决问题:清除浏览器缓存和Cookies清除浏览器中的缓存数据和Cookies,有时候这些数据可能会导致加载问题。 在浏览器设置中找到“清除浏览数据”选项进行操作。更换浏览器尝试使用不同的浏览器访问该网站,排…

解决网站404页面问题的有效方法

解决网站404页面问题的有效方法主要包括以下几个步骤: 1. 确认具体URL记录下出现404错误的具体URL。 检查URL是否拼写正确或路径是否合理。2. 检查链接有效性确认该URL对应的资源是否存在。 检查是否有文件被误删除或移动。3. 检查服务器配置查看服务器配置文件(如Apache的.h…

公司官网网站首页的轮播图要怎么更换

更换公司官网首页的轮播图通常涉及以下几个步骤:准备图片确保新图片的尺寸和格式符合网站的要求。 优化图片质量,确保加载速度快。上传图片登录到网站的内容管理系统(CMS)或FTP到服务器上,将新图片上传到相应的文件夹。更新轮播图设置如果使用CMS:进入网站后台管理界面。…

网站logo替换方法:如何替换网站Logo图片(适用任何网站)

替换网站Logo图片的操作取决于网站的技术栈和内容管理系统(CMS)。以下是一些通用步骤,适用于大多数使用HTML/CSS和CMS构建的网站:备份当前网站数据在进行任何更改之前,请确保备份整个网站的数据,包括数据库和文件系统,以防意外丢失重要信息。获取新的Logo图像准备好新的…

网站返回首页发生错误怎么办

当遇到网站返回首页发生错误的情况时,可以按照以下步骤进行排查和解决:检查网络连接:确保当前网络连接正常。 尝试刷新页面或重新启动路由器。清除浏览器缓存:清除浏览器缓存数据,有时旧的缓存可能导致加载问题。尝试其他浏览器:使用不同的浏览器访问该网站,看是否依然存…

网站出现404错误的原因与解决方案

网站出现“404 Not Found”错误通常表示请求的资源在服务器上找不到。这种错误可能是由多种原因引起的。下面是一些常见原因及相应的解决方案: 常见原因URL 输入错误用户输入的 URL 不正确或拼写错误。页面已被删除或移动页面已经被网站管理员删除或移动到了其他位置。重定向问…

公司网站如何修改电话

要修改公司网站上的电话号码,你可以按照以下步骤操作:登录网站后台:如果你的公司网站有内容管理系统(CMS),如WordPress、Drupal等,请登录该系统的管理后台。 如果是静态页面或自定义开发的网站,直接进入网站的文件编辑环境。找到电话号码所在位置:通常电话号码会放在网…

如何对网站进行管理 —修改电话

要对网站上的电话号码进行修改,通常需要遵循以下步骤。具体操作会根据您使用的网站构建平台或CMS(内容管理系统)有所不同,但基本流程相似:登录到网站后台:打开您的网站,并找到管理员登录入口。 输入用户名和密码登录。定位电话号码位置:根据电话号码在网站上的显示位置…

帝国cms网站查看管理员账号、 修改密码、查看认证码、修改安全答案的方法

1. 查看管理员账号登录到 phpMyAdmin。 选择数据库 empirecms。 打开表 phome_enewsuser。 查看 username 字段的内容。2. 修改密码登录到 phpMyAdmin。 选择数据库 empirecms。 打开表 phome_enewsuser。 修改 password 字段的内容为 322d3fef02fc39251436cb4522d29a71。 修改…