【cf比赛记录】Codeforces Round #601 (Div. 2)
Codeforces Round #601 (Div. 2) ---- 比赛传送门
周二晚因为身体不适鸽了,补题补题
A
// http://codeforces.com/contest/1255/problem/A
/*
签到题 简单的贪心题
本考虑过是否有先小于再加上去会更小的情况
但两种情况恰好步数是一样的
*/
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int T;
int a, b;
int num[] = { 5, 2, 1 };
int main()
{
scanf("%d", &T);
while(T--){
scanf("%d %d", &a, &b);
int ans = 0, tmp, i = 0;
if(a != b){
tmp = abs(a - b);
while(tmp){
int div = tmp / num[i];
ans += div;
tmp -= num[i] * div;
i++;
}
}
printf("%d\n", ans);
}
return 0;
}
B
// http://codeforces.com/contest/1255/problem/B
/*
图形...
既然 m <= n 的话,要满足题目的要求就只能 m == n 了
那既然如此......把冰箱都连成环就 Ok 了
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int T, n, m;
int main()
{
scanf("%d", &T);
while(T--){
scanf("%d %d", &n, &m);
int a, tot = 0;
for(int i = 1; i <= n; i++){
scanf("%d", &a); tot += a;
}
if(n < 3 || m != n) printf("-1\n"); // 特判:当出现这种情况时,是肯定不符合的
else {
printf("%d\n", tot * 2);
for(int i = 1; i <= n; i++){
printf("%d %d\n", i, i % n + 1);
}
}
}
return 0;
}
C
// http://codeforces.com/contest/1255/problem/C
/*
找规律 ---- 拓扑排序
首尾的数是最好找的,因为只会出现一次
根据样例分析
5
4 3 2
2 3 5
4 1 2
依次出现的次数
1:1 2:3 3:2 4:2 5:1
可见, 1, 5各只出现了 1 次 因此首尾分别是 1 5,然后 2 出现了 3 次 所以 2 是中间数
然后 3 4 就可以根据 1 2 的收尾排序就可以确认了
1 4 2 3 5
或者
5 3 2 4 1
因此,每次找 tot[] 为 1 的数加进首跟尾
要提前记录每个点所在的 arr 位置(减少查找时的时间)
----拓扑排序
但由于自己实现太繁琐,所以没实现出来就去找AC的代码,发现了dalao的凝练版
----参考了 yongwhan dalao的代码,#65412415
*/
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int n;
int a, b, c;
int tot[100005];
bool used[100005];
vector<int> num[100005];
/*
对该代码的分析:
因为每组只有3个数
所以对于样例 1 4 2 3 5 这组数据
1 的相邻有 4 2
4 的相邻有 1 2 3
2 的相邻有 1 4 3 5
...
先找出 1 (这个很好找)
找出 1 后可以确立第二个数是 4 (因为 4 只出现了两次,而 2 出现了 3 次)
然后从 1 开始找 "下一个数", 此时与 1 相邻的只有 2 了 ---- 输出,并记录其已被使用
接着从 4 开始找还未被使用过且相邻的数,于是进而找到 3
接着从 2 开始找,接着就找到了 5
即便 n > 5 这样的方法也是成立的,如
n = 7; 排序是 3 2 1 7 6 5 4
先找到 3 2
然后从 3 开始找,相邻的还没用的就只剩下 1
接着从 2 开始找,同理还剩下 7
继续从 1 开始找,同理还剩下 6
继续从 7 开始找,剩下 5
最后从 6 开始找,最后的是 4
...
所以dalao的代码还是tql
*/
int main()
{
scanf("%d", &n);
for(int i = 0; i < n - 2; i++){
scanf("%d %d %d", &a, &b, &c);
num[a].push_back(b); num[a].push_back(c);
num[b].push_back(a); num[b].push_back(c);
num[c].push_back(a); num[c].push_back(b);
tot[a]++; tot[b]++; tot[c]++;
}
int x, y, z;
for(int i = 1; i <= n; i++){
if(tot[i] == 1){
x = i;
break;
}
}
if(tot[num[x][0]] == 2) y = num[x][0];
else y = num[x][1];
used[x] = used[y] = true;
printf("%d %d ", x, y);
// 以下的注释可以去掉输出看看更方便理解...
for(int i = 1; i <= n - 2; i++){
// printf("\nx:%d\n", x);
for(int j = 0; j < num[x].size(); j++){ // 找到相邻且未被使用过的点
// printf("j:%d num[x][]:%d used:%d\n", j, num[x][j], used[num[x][j]]);
if(!used[num[x][j]]) { // 由于特殊性,这个点只有 1 个
z = num[x][j];
// printf("z:%d\n", z); // 从这里看出,每次这么进行的时候 z 只改变了一次
}
}
used[z] = true;
printf("%d ", z);
x = y; y = z;
}
return 0;
}
// 下面是我自己敲的臃肿代码 思想是运用拓扑排序加优化 结果把自己绕晕了
//#include<iostream>
//#include<cstdio>
//#include<stack>
//#include<vector>
//#include<algorithm>
//#include<queue>
//#include<stack>
//using namespace std;
//
//int n;
//struct jilu{
// int tot, who;
//}cot[100005]; // tot 记录 who 出现了多少次;
//struct node{
// int a, b, c;
//}arr[100005];
//bool used[100005]; // 记录哪个arr已经被用过
//vector<int> tmp[100005]; // 记录数字 i 所在输入数组里的位置
//queue<int> take; // 本次进行了减减的数
//stack<int> ans2;
//queue<int> ans1;
//
//bool cmp(jilu a, jilu b){
// if(a.tot == b.tot) return a.who < b.who;
// return a.tot < b.tot;
//}
//
//
//int main()
//{
// scanf("%d", &n);
// for(int i = 1; i <= n - 2; i++){
// scanf("%d %d %d", &arr[i].a, &arr[i].b, &arr[i].c);
// cot[arr[i].a].tot++; cot[arr[i].b].tot++; cot[arr[i].c].tot++;
// cot[arr[i].a].who = arr[i].a;
// cot[arr[i].b].who = arr[i].b;
// cot[arr[i].c].who = arr[i].c;
// tmp[arr[i].a].push_back(i);
// tmp[arr[i].b].push_back(i);
// tmp[arr[i].c].push_back(i);
// }
//
// sort(cot + 1, cot + n + 1, cmp);
//
// ans1.push(cot[1].who); ans2.push(cot[2].who);
// for(int i = 0; i < tmp[cot[1].who].size(); i++){ // 首的初始化
// cot[cot[1].who].tot--;
// int p = tmp[cot[1].who][i];
// used[p] = true;
// if(arr[p].a != cot[1].who) {
// cot[arr[p].a].tot--;
// take.push(arr[p].a);
// }
// if(arr[p].b != cot[1].who) {
// cot[arr[p].b].tot--;
// take.push(arr[p].b);
// }
// if(arr[p].c != cot[1].who) {
// cot[arr[p].c].tot--;
// take.push(arr[p].c);
// }
// }
//
// for(int i = 0; i < tmp[cot[2].who].size(); i++){ // 尾的初始化
// cot[cot[2].who].tot--;
// int p = tmp[cot[2].who][i];
// used[p] = true;
// if(arr[p].a != cot[2].who) {
// cot[arr[p].a].tot--;
// take.push(arr[p].a);
// }
// if(arr[p].b != cot[2].who) {
// cot[arr[p].b].tot--;
// take.push(arr[p].b);
// }
// if(arr[p].c != cot[2].who) {
// cot[arr[p].c].tot--;
// take.push(arr[p].c);
// }
// }
//
// while(!take.empty()){
// ...
// }
//
// return 0;
//}
D
// http://codeforces.com/contest/1255/problem/D
// 参考:HazemAk1 的 #65396404 的 AC 代码
/*
要使 k 头奶牛在点上取得的 R 尽量均匀 ---- 即最大与最小的差 <= 1
要求每头牛所占的 R 的数目很简单
关键是处理图的连块问题
搜索
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const char out[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 62种输出情况
int T, H, W, k, R, now;
char maze[102][102];
char ans[102][102];
int have[70];
//bool used[102][102];
//struct node{
// int h, w;
//};
//queue<node> q;
//int dw[] = { 1, 0, -1, 0 };
//int dh[] = { 0, 1, 0, -1 };
void solve(){
int x = 0, y = 0;
for(int i = 0; i < k; i++){
while((have[i] || i == k - 1) && x < H){ // 当还没选够选够或者是最后一头牛的时候就继续进行, x 还没到达最大行的时候继续进行
ans[x][y] = out[i]; // 既然还没有找完 那该点就是当前牛的位置啦
if(maze[x][y] == 'R') have[i]--; // 如果有一饭点就减减
if(x % 2 == 0){ // 当此时为偶数行的时候就从左往右遍历(因为是从0开始)
y++;
if(y > W - 1) x++, y = W - 1; // 下一行操作
}
else { // 同理 当此时为奇数行的时候就从右往左遍历
y--;
if(y < 0) x++, y = 0; // 下一行操作
}
}
}
}
int main()
{
scanf("%d", &T);
while(T--){
R = 0; // 记录总的R点数
memset(used, false, sizeof(used));
scanf("%d %d %d", &H, &W, &k);
for(int i = 0; i < H; i++){
scanf("%s", maze[i]);
for(int j = 0; j < W; j++){
if(maze[i][j] == 'R') R++;
}
}
// 给每头牛所占有的R点个数赋值
int l = R / k;
int lea = R - k * l;
for(int i = 0; i < k; i++){
have[i] = l + (lea > 0);
lea--;
}
solve();
// 输出
for(int i = 0; i < H; i++){
for(int j = 0; j < W; j++){
printf("%c", ans[i][j]);
}
printf("\n");
}
// 以下是我自己写的方法,繁杂,不利索
// now = 0;
// for(int i = 0; i < H; i++){
// for(int j = 0; j < W; j++){
// if(!used[i][j]){
////// printf("now:%d\n", now);
//// used[i][j] = true;
//// if(maze[i][j] == 'R') have[now]--;
////// printf("h:%d w:%d have:%d\n", i, j, have[now]);
//// q.push({i, j});
//// bfs();
//// now++;
// dfs(i, j, now, have[now]);
// }
// }
// }
}
return 0;
}
//bfs 也绕晕了自己
//void bfs(){
// bool flag = false;
// while(!q.empty()){
// node n = q.front(); q.pop();
// ans[n.h][n.w] = out[now];
//
// for(int i = 0; i < 4; i++){
// int nh = n.h + dh[i]; int nw = n.w + dw[i];
// if(0 <= nh && nh < H && 0 <= nw && nw < W && !used[nh][nw] && (now == k - 1 || !flag)){
// used[nh][nw] = true;
// q.push({nh, nw});
// if(maze[nh][nw] == 'R'){
//// printf("now:%d nh:%d nw:%d maze:%c\n", now, nh, nw, maze[nh][nw]);
// have[now]--;
// if(have[now] == 0 && now != k - 1){
// flag = true;
// }
// }
// }
// }
// }
//}
// 我这个 dfs 有坑
//void dfs(int h, int w, int &now, int &tot){
// used[h][w] = true;
// ans[h][w] = out[now];
// if(maze[h][w] == 'R'){
// tot--;
// maze[h][w] = '.';
// if(tot == 0 && now != k - 1){
// now++;
// return ;
// }
// }
//
// for(int i = 0; i < 4; i++){
// int nh = h + dh[i]; int nw = w + dw[i];
// if(0 <= nh && nh < H && 0 <= nw && nw < W && !used[nh][nw]){
// dfs(nh, nw, now, tot);
// if(tot == 0) return ;
// }
// }
//}
因为没有打比赛所以就没有这次的rating啦w
【cf比赛记录】Codeforces Round #601 (Div. 2)的更多相关文章
- Codeforces Round #601 (Div. 2) C League of Leesins
把每一次输入的一组数字存下来,然后把每个数字出现的组数存下来 然后找只出现过一次的数字a,那么这个数字a不是开头就是结尾,默认为开头(是哪个都无所谓),然后去找和它出现在同一组的两个数字b和c,而b和 ...
- Codeforces Round #601 (Div. 2)
传送门 A. Changing Volume 签到. Code /* * Author: heyuhhh * Created Time: 2019/11/19 22:37:33 */ #include ...
- Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version)
Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version) N个盒子,每个盒子有a[i]块巧克力,每次操作可以将盒子中的 ...
- Codeforces Round #601 (Div. 2) E1 Send Boxes to Alice (Easy Version)
#include <bits/stdc++.h> using namespace std; typedef long long ll; ; int a[N]; int n; bool pr ...
- Codeforces Round #601 (Div. 2) D Feeding Chicken
//为了连贯,采取一条路形式,从第一行开始 也就是s型 #include <bits/stdc++.h> using namespace std; ; char str[MAXN][MAX ...
- Codeforces Round #601 (Div. 2) B Fridge Lockers
//题目要求的是每一个点最少要有两条边连接,所以可以先构成一个环.然后再把剩余的最短的边连接起来 #include<iostream> #include<algorithm> ...
- Codeforces Round #601 (Div. 2) A Changing Volume
好吧,其实我拿到这个题的时候,首先想到了bfs,写完之后,开开森森的去交代码,却在第二个数据就TEL,然后优化半天,还是不行. 最终,我盯着1,2,5发呆半天,wc,然后直接贪心 #include&l ...
- Codeforces Round #601 (Div. 2)E(寻找质因子,DP)
先分解质因数,对于当前a[i],假设当前的质因数为x,这个位置要满足能被k整除,有两个可能,要么是它向后一个转移x%k个,要么是后一个向它转移k-x%k个. 对于每一个a[i]满足后,因为只会对下一个 ...
- Codeforces Round #601 (Div. 2)D(蛇形模拟)
#define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; vector<char>an ...
随机推荐
- C#基础语法,快速上収C#
C#代码基础语法 对新手的帮助很大,可以尝试多看看然后在敲敲 // 单行注释以 // 开始 /* 多行注释是这样的 */ /// <summary> /// XML文档注释 /// < ...
- C++之拷贝控制 (Copy Control)
只有2种成员 值成员: 指针成员: 依实现可分为raw pointer / shared_ptr; 现在,仅考虑第③种:资源对象共享 角度来考虑拷贝控制 类的两种语义:值语义.似指针 编译器提供的de ...
- 浏览器解析js
网页加载js步骤 1.浏览器一边下载html网页,一边开始解析(不等下载完就解析)2.遇到<script>标签,暂停解析,网页渲染的控制权交给javascript引擎3.如果<scr ...
- BUAA-OO-2019 第二单元总结
第五次作业 本次作业,需要完成的任务为单部多线程傻瓜调度(FAFS)电梯的模拟. 设计策略 先来先服务的单电梯是一个标准的"生产者-消费者"模型.虽然在本次作业中调度器似乎是不必要 ...
- 5.Javascript闭包得实现原理和作用
闭包的实现原理和作用 1.闭包的概念:指有权访问另一个函数作用域中的变量的函数,一般情况就是在一个函数中包含另一个函数. 2.闭包的作用:访问函数内部变量.保持函数在环境中一直存在,不会被垃圾回收机制 ...
- HTNL5-ARIA role属性
WAI-ARIA Web Accessibility Initiative’s Accessible Rich Internet Applications 无障碍网页倡议–无障碍的富互联网应用,也简称 ...
- node.js中的fs.rename()方法
node.js 中的fs.rename()模块 var fs=require('fs');//node.js的核心模块 原生模块.修改文件名称,可更改文件的存放路径 方法说明 : 修改文件名称,可更改 ...
- CSS文本单行或者多行超出区域省略号(...)显示方法
单行超出时,主要用到几个CSS属性: 1.text-overflow : clip | ellipsis ; clip : 不显示省略标记(...),而是简单的裁切ellipsis : 当对象内文本溢 ...
- ORACLE数据库导出表,字段名,长度,类型,字段注释,表注释语句
转自:https://www.cnblogs.com/superming/p/11040455.html --数据库导出表,字段名,长度,类型,字段注释,表注释语句 SELECT T1.TABLE_N ...
- python可视化_matplotlib
对于Python数据可视化库,matplotlib 已经成为事实上的数据可视化方面最主要的库,此外还有很多其他库,例如vispy,bokeh, seaborn,pyga,folium 和 networ ...