训练赛3

2024-08-28 10:58
文章标签 训练赛

本文主要是介绍训练赛3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2348&cid=1232

题意:

有两个磁盘,第一个磁盘有n个安装包,第二个磁盘有m个安装包。有些安装包的安装依赖于其他安装包的安装,即如果x依赖与y,那么包y必须在包x之前安装,每次可以插入这两张磁盘中的一张去安装一些包,求以最小的交换次数安装好所有的包,保证依赖关系不存在环,开始插入和最后取出都算一次交换,初始是磁盘设备是为空的。

解题思路:做两次拓扑排序即可,分别代表先插第一个磁盘和第二个磁盘的交换次数,然后取最小值。

ps:比赛时一直没看懂题意。结束后听人说是拓扑排序。因为安装包的安装是有先后依赖关系的,才感觉有点像拓扑排序。结果自己敲愣是没敲出来。sad。。。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;const int INF = 0x3f3f3f3f;
int n,m,k;
vector <int> edge[100010];//保存依赖该点的点
queue <int> que[2];
int in[100010],deg[100010];//保存入度
int ans;void toposort(int kind)
{//用两个队列分别维护两个磁盘,假如先对第一个磁盘拓扑排序,那么交换次数增1是在第一个队列为空时,//因为这时就要拔掉第一个磁盘,插入第二个磁盘。当两个队列都为空时,拓扑排序完成。while(!que[0].empty()) que[0].pop();while(!que[1].empty()) que[1].pop();int cnt = 0;for(int i = 1; i <= n+m; i++){if(deg[i] == 0)	//入度为0的点全部进队列{if(i <= n) que[0].push(i);else que[1].push(i);}}while(!que[0].empty() || !que[1].empty()){while(!que[kind].empty())	{int u = que[kind].front();que[kind].pop();for(int i = 0; i < (int)edge[u].size(); i++){int v = edge[u][i];deg[v]--;if(deg[v] == 0){if( v <= n) que[0].push(v);else que[1].push(v);}}}//当前队列为空,说明一个磁盘中的包安装完了,应换另一个磁盘,所以增1。kind = kind^1;cnt++;}ans = min(ans,cnt);
}int main()
{while(~scanf("%d %d %d",&n,&m,&k)){if(n == 0 && m == 0 && k == 0) break;for(int i = 1; i <= n+m; i++)edge[i].clear();memset(in,0,sizeof(in));memset(deg,0,sizeof(deg));int u,v;while(k--){scanf("%d %d",&u,&v);edge[v].push_back(u);in[u]++;}ans = INF;for(int i = 1; i <= n+m; i++)deg[i] = in[i];toposort(0);//假如先插入第一个磁盘,进行拓扑排序。for(int i = 1; i <= n+m; i++)deg[i] = in[i];toposort(1);//假如先插入第二个磁盘,进行拓扑排序。printf("%d\n",ans+1);}return 0;
}

http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2351&cid=1232

题意: 给一个数n,代表n个人,n是用xyez表示的十进制数。x表示第一个数,y表示第二个数,z表示后面0的个数。n个人围城圈,从第二个人开始(先出圈),每隔一个未出圈的人就出圈一个人(出圈只是一种标记,还在圈中)。问最后一个人的编号是多少。
思路:继续淡定的找规律吧。。n是偶数的条件下,n是2的幂结果为1,否则是n与2的幂(小于n且距离n最小)差值的2倍.
n奇数,结果比n-1时大2.
#include <stdio.h>
#include <string.h>
#include <cmath>
using namespace std;int pow2[30] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,
524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728};int main()
{char str[5];while(~scanf("%s",str)){if(strcmp(str,"00e0") == 0)break;if(strcmp(str,"01e0") == 0){printf("1\n");continue;}int x,y,z;x = str[0]-'0';y = str[1]-'0';z = str[3]-'0';int mul = (int)pow(10,z);int num = x*mul*10 + y*mul;//printf("%d\n",num);if(num % 2 == 0){if((num & (num-1)) == 0){printf("1\n");continue;}for(int i = 0; i < 28; i++){if(pow2[i] < num && pow2[i+1] > num){printf("%d\n",(num-pow2[i])*2+1);break;}}}else{num = num-1;if((num & (num-1)) == 0){printf("3\n");continue;}for(int i = 0; i < 28; i++){if(pow2[i] < num && pow2[i+1] > num){printf("%d\n",(num-pow2[i])*2+3);break;}}}}return 0;
}/*int main()
{for(int i = 0; i <= 27; i++)printf("%d\n",(int)pow(2,i));
}*/
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2352&cid=1232
题意:给定一个字符串,如果有连续相等的字符,输出该字符的个数和该字符,如果个数大于9,要分开输出,先输出前9个,再输出剩余的。如果有连续不相等的字符,那么在该段字符前后分别加上'1',若其中有字符'1',就输出两个'1'。
思路:用一个数组num[]记录从当前字符起,连续相等的字符的个数。如果大于1说明有连续相等的子串,否则,说明没有连续相等的子串。
#include <stdio.h>
#include <string.h>char s[1010];
int num[1010];int main()
{while(gets(s)){int len = strlen(s);for(int i = 0; i < len; i++){num[i] = 0;int cnt = 0;for(int j = i; j < len; j++){if(s[i] == s[j])cnt++;else break;}num[i] = cnt;}int flag = 1;for(int i = 0; i < len;){if(num[i] == 1){if(flag){printf("1");flag = 0;}if(s[i] == '1') printf("%c%c",s[i],s[i]);else printf("%c",s[i]);i++;}else{if(flag == 0){printf("1");flag = 1;}if(num[i] <= 9){printf("%d%c",num[i],s[i]);i += num[i];}else{printf("9%c",s[i]);i += 9;}}}if(!flag) printf("1");printf("\n");}return 0;
}


这篇关于训练赛3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114569

相关文章

训练赛 Grouping(强连通分量缩点 + DAG求最长路)

http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=158#problem/F 大致题意:给出n个人和m种关系(ti,si),表示ti的年龄不小于si。问最小能被划分为几个集合,每个集合都要满足里面的人都无法比较。 思路:对于一条路上的点,它们必定不能被划分到同一个集合中,因此原题变为求一条最长路。而题目中有可能出现

hdu5289 Assignment --2015多校训练赛(一)

题意: 给定一串数字,里面存在多少个区间[l, r] 使得里面的最大值与最小值之差小于k。 思路: 用RMQ预处理出所有区间的最大值与最小值之差。之后枚举左端点L, 二分处理差值小于k的最左边端点R,把所有 的R-L+1加上就是答案。 /************************************************ Author: fisty* Create

2013 - ECJTU 暑期训练赛第三场-problem-K

K - K Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1875 Description 相信大家都听说一个“百岛湖”的

2013 - ECJTU 暑期训练赛第三场-problem-H

H - H Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3070 Description In the Fibonac

2013 - ECJTU 暑期训练赛第三场-problem-L

L - L Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1879 Description 省政府“畅通工程”的目标是使

2013 - ECJTU 暑期训练赛第六场-problem-F

F -F Crawling in process... Crawling failed Time Limit:1000MS    Memory Limit:32768KB     64bit IO Format:%I64d & %I64u SubmitStatus Practice HDU 1575 Description A为一个方阵,则Tr A表示A的迹(就是主对

暑期训练赛(6)解题报告

暑期训练赛(6)解题报告 首先向大家道个歉,对不住大家了,让大家WA了一下午,简直就如此题比赛题目一样Orz啊~~~此次比赛确实难度太大,是我没有考虑周到,但是这也说明我对你们现在的水平和实力期望非常高,想去年我们暑假训练赛这个时候基本上F题都是压轴题,什么dfs,bfs,什么矩阵快速幂,什么dp,什么vector,map,set根本都是两眼一抹黑,基本上就是:这些都是什么玩意能吃吗!

暑期训练赛(6)E

C. Cutting Figure time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You've gotten an n × m sheet of squared paper. Some o

[2021.11.19]UPC-2021级新生个人训练赛第4场-19276 Problem B ok 字符串

商场中展示了这么多玩具,乐乐爱不释手。现在游戏环节开始,只要你能解决一个问题,就能够挑选一件精美的玩具。此时,乐乐需要你们这帮“牛娃”的帮助,请你帮助乐乐解决这个问题。  现在给你一个长度为 n 的字符串,该字符串只包含字符’o’和’k’。你最多可以修改 t 个字符(将字符’o’改为字符’k’或将字符’k’改为字符’o’),使得某一段连续相同的字符个数是最多的。 例如:  ‘ooooo’或’kkk

[2021.11.14]UPC-2021级新生个人训练赛第3场-19283 Problem E 调研

题目描述 有一直线型展台共有 m 个展位,按该展位离入口处的远近顺序编号,其编号分别为 1、2、……、m;其中只有 n 个是展示新技术的展位,最后一个展示新技术的展位编号为 m。 这次调研分两个小组进行,每个小组最多调研连续的 10 个展位,且每个小组调研的展位至少相隔 2 个展位。  乐乐希望你设计一种安排方案,使领导调研更多的展示新技术的展位。 输入 第一行只有一个正整数:n,表示展示新