目录
  • 比赛链接
  • C.Corrupted Contest
    • 题意
    • 解题思路
    • Code
  • E.Efficiently Elevated
    • 题意
    • 解题思路
    • Code
  • H.Hungry Henk
    • 题意
    • 解题思路
    • Code
  • I.Incomplete Implementation
    • 题意
    • 解题思路
    • Code
  • J.Jigsaw
    • 题意
    • 解题思路
    • Code
  • 感想

比赛链接

传送门

C.Corrupted Contest

题意

输入一个n表示有n个人,然后输入一个p表示有p道题,接下来输入n行表示每个人昨晚最后一题的时间的排名,问你能否找到一种做题的排序方式使得满足这样的时间排序,如果存在不能确定的情况就输出"ambiguous",否则输出每个人的做题数

解题思路

很明显这个题目是非递增的序列,并且如果后一个人的最后做出来的时间比前面一个人少的话,那么后一个人的做题的数量必然比前面那个人的做题数目少, 但是需要注意的是如果遇到时间为0的情况那么这个人做出来的题目数必然为0,我们通过差分处理一下,如果第一个时间为0的话后面都是0,直接输出就行,否则的话第一个人的做题数一定是p,然后我们按照之前的差分数组遇到-1就减少,我们最后再扫一遍结果数组,如果出现断层情况那么一定是不能确定的,那么找到了断层就直接输出"ambiguous"否则的话就直接输出我们处理的答案

Code

#include<bits/stdc++.h>
using namespace std;
const int N = 10005;
int n,p,a[N],b[N],c[N];int main()
{scanf("%d%d",&n,&p);for(int i = 0;i < n; ++i) {scanf("%d",&a[i]);}memset(c,-1,sizeof c);if(a[0]) {c[0] = p;}else {c[0] = 0;}c[n] = 0;for(int i = 1;i < n; ++i) {if(a[i] == 0) {c[i] = 0;continue;}if(a[i]-a[i-1] >= 0) {b[i] = 1;}else {b[i] = -1;}}for(int i = 1;i < n; ++i) {if(c[i] == 0) continue;if(b[i] == 1) {c[i] = c[i - 1];}else {c[i] = c[i - 1] - 1;}}for(int i = 1;i <= n; ++i) {if(c[i] - c[i-1] < -1) {puts("ambiguous");return 0;}}for(int i = 0;i < n; ++i) {
//      printf("c[%d] = %d\n",i + 1,c[i]);printf("%d\n",c[i]);    }return 0;
}

E.Efficiently Elevated

题意

给你一个\(h \times w\) 的地图,然后给每个坐标点输入一个值,表示的是该点楼层的高度,高度为1的楼层不需要电梯,在一个楼层群中只需要建立一个最高的楼层的电梯即可,问你最少需要多少电梯

解题思路

很明显我们可以优先对楼层高的电梯周围的较低楼层进行染色,然后看染色几次就能全部满足,这个就是最少所需要的电梯数

Code

#include<bits/stdc++.h>
using namespace std;const int N = 505;
int n,m;
int mp[N][N];
int A[N][N];
int dx[4] = {0,0,-1,1};
int dy[4] = {-1,1,0,0};struct node {int x,y,h;node(int x,int y,int h) {this->x = x;this->y = y;this->h = h; }bool operator< (const node &r) const { return (h < r.h); }
};void dfs(int i,int j) {if(!mp[i][j]) return;mp[i][j] = 0;for(int k = 0;k < 4; ++k) {int nx = i + dx[k];int ny = j + dy[k];if(nx > 0 && nx <= n && ny > 0 && ny <= m && A[i][j] >= A[nx][ny]) {dfs(nx,ny);} }
}
priority_queue<node> que;int main()
{scanf("%d%d",&n,&m);for(int i = 1;i <= n; ++i) {for(int j = 1;j <= m; ++j) {scanf("%d",&mp[i][j]);A[i][j] = mp[i][j];if(mp[i][j] <= 1)mp[i][j] = 0;else mp[i][j] = 1;que.push({i,j,A[i][j]});}}int ans = 0;while(que.size()) {node p = que.top();que.pop();if(mp[p.x][p.y]) {dfs(p.x,p.y);ans++;}}printf("%d",ans);return 0;
}

H.Hungry Henk

题意

输入一个n,表示有n组菜,然后对每一组菜输入一个d表示的是每一组菜有多少个菜,然后输入d个菜,问你能否找到一组菜,它的每一个菜的小写字母个数都小于等于20,然后输出这一组菜(可以输出任意满足题意的答案)

解题思路

直接暴力模拟就行,签到题

Code

#include<bits/stdc++.h>
using namespace std;
int n;
int main()
{int d;string ch,ans="";int ansd;cin>>n;for(int i = 0;i < n; ++i) {cin>>d;ansd = d;bool fg = true;for(int j = 0;j < d; ++j) {cin>>ch;if(ch.size() > 20) fg = false;ans += ch;ans += "\n";}if(fg == true) {while(++ i < n) {cin>>d;for(int j = 0;j < d; ++j) cin>>ch;}cout<<ansd<<"\n";cout<<ans<<"\n";break;}}return 0;}

I.Incomplete Implementation

题意

输入长度为n的乱序数组(每个数都是不一样的,但是都是小于等于n的),然后你可以每次任意选择n/2个不同的下标使得他们值排序,然后有序放回这几个位置,你最多有三次操作机请问你怎么操作,会使得这个乱序数组恢复有序。(可以输出仍以方式)

解题思路

我们第一步先让 [1,n/2] 的值恢复到原位,然后再让[n/4+1,n/2]恢复到原位,最后直接输出剩下的n/2个数,即可完成排序,值得注意的是,当我们再处理前两种的情况有可能会有这样的情况,那个数本来就在自己的位置,那么我们就需要找一些其他位置的数来凑成n/2个数,我们应该从1开始往后选择,因为我们是优先对前面处理,也就是前面的数字不会影响我们对排序的处理

Code

#include<bits/stdc++.h>
using namespace std;const int N = 100005;int n,a[N],b[N];
set<int> ans;int main()
{scanf("%d",&n);for(int i = 1;i <= n; ++i) {scanf("%d",&a[i]);b[a[i]] = i;}printf("%d\n",3);ans.clear();for(int i = 1;i <= n/4; ++i) {int a1 = b[i];int a2 = i;if(a1 == a2) {a2 = n;}else {b[a[i]] = a1; b[i] = i;int temp = a[a1];a[a1] = a[a2];a[a2] = temp;}ans.insert(a1);ans.insert(a2);}int i = 1;while(ans.size() < n / 2) {ans.insert(i++);}for(auto it : ans) {printf("%d ",it);}puts("");ans.clear();
//  for(int i = 1;i <= n; ++i) printf("%d%c",a[i],i==n?'\n':' ');
//  for(int i = 1;i <= n; ++i) printf("%d%c",b[i],i==n?'\n':' ');
//  for(int i = 1;i <= n; ++i) b[a[i]] = i;for(int i = n/4 + 1;i <= n/2; ++i) {int a1 = b[i];int a2 = i;if(a1 == a2) {a2 = n;}else {b[a[i]] = a1; b[i] = i;int temp = a[a1];a[a1] = a[a2];a[a2] = temp;}ans.insert(a1);ans.insert(a2);}i = 1;while(ans.size() < n / 2) {ans.insert(i++);}for(auto it : ans) {printf("%d ",it);}puts("");
//  for(int i = 1;i <= n; ++i) b[a[i]] = i;for(int i = n/2+1;i <= n; ++i) {printf("%d%c",a[i],i==n?'\n':' ');}
//  for(int i = 1;i <= n; ++i) {
//      printf("%d ",a[i]);
//  }return 0;
}

J.Jigsaw

题意

给你拼图的一些碎片,角落的碎片数为c,边缘的碎片数为e,中间的碎片数为m,问你能否用尽这些碎片拼出一个图,如果可以的话就输出最后拼图的长和宽,否则输出“impossible”

解题思路

很明显如果角落的c不为4,那么一定不能满足条件,然后如果e不能被2整除那么一定不能满足条件,最后就是计算长和宽了,这里我们设内矩形的长和宽为a,b

\[(a + b)\times 2= e \]
\[a\times b = m \]

然后可以得到一个一元二次方程,注意的是,解可能有两种,所以我们两种都要考虑

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
int c,e,m;
signed main()
{cin>>c>>e>>m;if(c == 4) {if(e % 2 == 0) {int a1,a2,b1,b2;a1 = (e + sqrt((e*e-16.0*m)))/4.0;a2 = (e - sqrt((e*e-16.0*m)))/4.0;b1 = (e/2)-a1;b2 = (e/2)-a2;if(a1 * b1 == m) {printf("%lld %lld\n",a1+2,b1+2);}else if(a2 * b2 == m) {printf("%lld %lld\n",a2+2,b2+2);}else {puts("impossible");}}else {puts("impossible");}}else {puts("impossible");}return 0;}

感想

被各位大佬暴捶……这个绝望小学我可能一被子都忘不掉(

打下来除了E题一直读错题,rhr写了一发wa了,然后我按照他的理解写了一发然后又wa了,然后我又去读题,感觉还是没懂,结果比赛结束发现是真的读错题了,想起了yy在比赛的时候想了个反例我按照rhr的想法,就直接否定了……,然后最后半小时就一直挂机

2021年北京理工大学ACM CLUB清明节组队训练赛相关推荐

  1. 北京理工大学ACM冬季培训课程之C++的应用

    写在前面: 本文章系列只和数据结构和C++细节相关 先甩出2020北京理工大学ACM冬季培训课程的哔哩哔哩网址 https://www.bilibili.com/video/BV1pE411E7RV? ...

  2. 北京理工大学ACM培训笔记

    c标准库常用函数回顾 cstring strlen() strcmp() strcpy() memset() memcpy() cmath 三角函数sin() 指数函数 浮点取整函数 cstdlib ...

  3. 北理计算机学硕考研科目,2021年北京理工大学计算机科学与技术(081200)图像计算与感知智能_考研专业目录_考试科目_考试范围 - 学途吧...

    不限 (学硕)(0101)哲学 (学硕)(0201)理论经济学 (学硕)(0202)应用经济学 (专硕)(0251)金融硕士 (专硕)(0252)应用统计硕士 (专硕)(0253)税务硕士 (专硕)( ...

  4. F 阎小罗的Minimax (第十届山东理工大学ACM网络编程擂台赛 正式赛 )

    题解:by Mercury_Lc 阎小罗的矩阵给的n和m都不超过300,枚举一下所有情况就可以了,用前缀和来储存.数组a[x][y]代表前x行前y列的和是多少,那么枚举每一种切割的方式就可以.注意一下 ...

  5. 第九届山东理工大学ACM网络编程擂台赛 正式赛 sdut4074博弈 - ldq的吃瓜比赛

    题目链接 ldq的吃瓜比赛 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description ldq 和 他的 ...

  6. 第九届山东理工大学ACM网络编程擂台赛 正式赛 sdut4075GCD - ldq的黑心啤酒厂

    题目链接 ldq's brewery Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description LDQ ...

  7. 备战省赛组队训练赛第一场

    目录 问题 A: 篮球队选拔 问题 B: 黑暗意志 问题 C: 调酒壶里的酸奶 问题 D: 过分的谜题 问题 E: 不存在的泳池 问题 F: fps游戏 问题 G: 流连人间的苏苏 问题 H: 路哥从 ...

  8. 2016CCPC东北地区大学生程序设计竞赛 (2018年8月22日组队训练赛)

    题目链接:http://acm.hdu.edu.cn/search.php?field=problem&key=2016CCPC%B6%AB%B1%B1%B5%D8%C7%F8%B4%F3%D ...

  9. 计蒜客 ACM竞赛高校联盟训练赛 第8场 煎牛排

    水一水. https://nanti.jisuanke.com/t/24205 煎牛排 题目描述 又是一个难得的周六,是时候远离食堂和外卖出去大吃一顿了.圈内知名吃货AA正想着中午去吃汉堡炸鸡烤肉火锅 ...

最新文章

  1. http响应Last-Modified和ETag以及Apache和Nginx中的配置
  2. 客户管理系统代码项目_西安人力资源管理系统如何有效管理销售,提高工作的效率...
  3. 8.11 更改用户ID和组ID
  4. MVC下HtmlHelper自带BeginForm表单提交与异步Ajax请求
  5. 一种导致android开发时无法生成R.java文件的原因
  6. sizeof 的结果取决于什么
  7. CVPR 2020 Oral 汇总:论文 / 代码 / 解读(更新中)
  8. 五十六、从高中碾转相除法、更相减损术算法谈起
  9. 内网网段范围_局域网中多网段的划分
  10. web.xml中servlet配置及其含义
  11. Butter knife 原理
  12. 通过Etcd+Confd自动管理Haproxy(多站点)
  13. Luhn校验原理与实现【转载】
  14. graphics | 基础绘图系统(三)——添加文本标注、坐标轴线和图例
  15. 面试官问你JavaScript,直接把这篇文章甩给他
  16. 2.Linux下C++操作MongoDB
  17. 面试官:谈谈 Tomcat 请求处理流程,我一脸懵逼。。
  18. mysql 定位字符串的位置
  19. VS C++ 字符串分割 strtok
  20. Maven by Example 1.7. Comparing Maven with Ant

热门文章

  1. Tensorflow 实战 Google 深度学习框架(第2版)---- 10.2.2节 P272 代码
  2. django动态HTML转PDF方法
  3. C语言将字符串转json
  4. 03-body标签中相关标签
  5. python--迭代器与生成器
  6. 如何让网站在百度有LOGO展示
  7. hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)
  8. 转帖:对linux中半增加半连接数量和防止服务器被dos攻击
  9. Matlab绘图基本控制命令
  10. 软件工程团队项目方案(四):高校申请指南