热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【ACUMTB团队赛】第一周题解

周赛地址:https:vjudge.netcontest152769#overviewA题:题意:Nikita想选择两门课A和B,使得他想要选的所有学位能被这两门课划分成4个集合,分别

周赛地址:https://vjudge.net/contest/152769#overview

 

A题:

题意:Nikita想选择两门课A和B,使得他想要选的所有学位能被这两门课划分成4个集合,分别是:有AB,有B没A,有A没B,没AB的,并求出这些集合的最大值的最小值。

思路:xjb模拟,才1e6的操作量……

 1 #include 
2 #include
3 #include
4
5 using namespace std;
6
7 const int maxn=105;
8
9 int mp[maxn][maxn];
10
11 int main()
12 {
13 int mx=0x7fffffff;
14 int n,m;
15 scanf("%d %d",&n,&m);
16 for(int i=1;i<=n;i++){
17 for(int j=1;j<=m;j++){
18 scanf("%d",&mp[i][j]);
19 }
20 }
21 int u=0,v=0;
22 for(int i=1;i<=m;i++){
23 for(int j=i+1;j<=m;j++){
24 int a=0,b=0,c=0,d=0;
25 for(int k=1;k<=n;k++){
26 if(mp[k][j]==0&&mp[k][j]==mp[k][i]) a++;
27 else if(mp[k][j]==1&&mp[k][j]==mp[k][i]) b++;
28 else if(mp[k][j]==0&&mp[k][i]==1) c++;
29 else if(mp[k][j]==1&&mp[k][i]==0) d++;
30 }
31 int tem=max(a,max(b,max(c,d)));
32 if(mx>tem){
33 mx=tem;
34 u=i,v=j;
35 }
36 }
37 }
38 printf("%d\n",mx);
39 printf("%d %d",u,v);
40 return 0;
41 }
View Code

 

B题:

题意:给出起始天和结束天,每ki天(i=2,3……)会作报告,作报告的天会被去掉,剩下的天按照k递增的顺序作报告,问剩下的天数为多少。

思路:按要求玩就行,不理解的话用vector模拟一下就行。

 1 #include
2 using namespace std;
3 int main()
4 {
5 int l,r,i=2;
6 cin>>l>>r;
7 while(r/i)
8 {
9 r=r-r/i;
10 i++;
11 }
12 i=2;
13 l--;
14 while(l/i)
15 {
16 l=l-l/i;
17 i++;
18 }
19 cout<endl;
20 return 0;
21 }
View Code

 

C题:

题意:n点m边的无向图,求1到n的次短路(最短路可能不止一条,但次短路必须是小于最短路的那条)。

思路:次短路的求法:到v点的最短路记为d[0][v],次短路记为d[1][v],按照Dijkstra的方法进行松弛,①如果d[0][v]>d[now.pos][now.t]+now.w,则先更新d[1][v]=d[0][v],再执行松弛操作,并且将两点的状态放入优先队列中。②如果d[1][v]>d[now.pos][now.t]+now.w,则进行松弛操作,将点的状态放入优先队列中。

由于此题最短路不唯一,在进行②时需要判断v是否为n且d[0][v]==d[now.pos][now.t]+now.w,如果成立则不进行松弛。

 1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7
8 using namespace std;
9
10 const int maxn=5005;
11 const int inf=1e9;
12
13 typedef pair<int,int> P;
14
15 vector

G[maxn];
16
17 struct node{
18 int t,v,pos;
19 bool operator <(const node&a)const{
20 return v>a.v;
21 }
22 };
23
24 int n,m;
25
26 int d[2][maxn];
27 int cou[2][maxn];
28
29 void init(){
30 for(int i=0;i){
31 G[i].clear();
32 d[0][i]=d[1][i]=inf;
33 }
34 }
35
36 void dijkstra(int s){
37 priority_queue q;
38 q.push((node){s,0,0});
39 d[0][s]=0;
40 while(!q.empty()){
41 node now=q.top();
42 q.pop();
43 for(int i=0;i){
44 int v=G[now.t][i].first;
45 int dis=G[now.t][i].second;
46 if(d[0][v]>d[now.pos][now.t]+dis){
47 d[1][v]=d[0][v];
48 d[0][v]=d[now.pos][now.t]+dis;
49 q.push((node){v,d[1][v],1});
50 q.push((node){v,d[0][v],0});
51 }
52 else if(d[1][v]>d[now.pos][now.t]+dis){
53 if(v==n&&d[0][v]==d[now.pos][now.t]+dis) continue;
54 d[1][v]=d[now.pos][now.t]+dis;
55 q.push((node){v,d[1][v],1});
56 }
57 }
58 }
59 }
60
61 int main(){
62 ios::sync_with_stdio(false);
63 cin.tie(0);
64 int T;
65 cin>>T;
66 int cou=0;
67 while(T--){
68 init();
69 cin>>n>>m;
70 for(int i=0;i){
71 int s,t,e;
72 cin>>s>>t>>e;
73 G[s].push_back(P(t,e));
74 G[t].push_back(P(s,e));
75 }
76 dijkstra(1);
77 cout<<"Case "<<++cou<<": "<1][n]<<endl;
78 }
79 return 0;
80 }

View Code

 

D题:

题意:在规定时间内,保证唱最多的歌的情况下,时间唱到最长(所有歌的时间<180s,劲歌金曲678s)

思路:01背包变形,dp[i]为唱时间<=i的歌的数目,最后遍历一遍找最大的dp[i],i为时间的最大值,记得留1s给劲歌金曲。

 1 #include 
2 #include
3 #include
4 #include
5
6 using namespace std;
7
8 const int maxn=11000;
9 const int maxs=55;
10
11 int dp[maxn];
12 int a[maxs];
13
14 int main(){
15 int T,cou=0;
16 cin>>T;
17 while(T--){
18 int n,t;
19 cin>>n>>t;
20 memset(dp,-1,sizeof(dp));
21 for(int i=1;i<=n;i++){
22 cin>>a[i];
23 }
24 dp[0]=0;
25 for(int i=1;i<=n;i++){
26 for(int j=t-1;j>=a[i];j--){
27 dp[j]=max(dp[j],dp[j-a[i]]+1);
28 }
29 }
30 int ans=t-1;
31 for(int i=t-1;i>=0;i--) if(dp[i]>dp[ans]) ans=i;
32 cout<<"Case "<<++cou<<": "<1<<" "<678<<endl;
33 }
34 return 0;
35 }
View Code

 

E题:

题意:给你n个数m组操作,每组操作有两种:1 x 将1到x的数变为升序排列,2 x 将1到x数变为降序排列,求最后的序列。

思路:单调栈。对于操作i,j(1<=ixi时,在xi

 1 #include 
2 #include
3 #include
4
5 using namespace std;
6
7 const int maxn=2e5+10;
8
9 typedef pair<int,int> P;
10
11 P Stack[maxn];
12
13 int a[maxn],soa[maxn],ans[maxn];
14
15 int main(){
16 ios::sync_with_stdio(false);
17 cin.tie(0);
18 int n,m;
19 cin>>n>>m;
20 for(int i=1;i<=n;i++){
21 cin>>a[i];
22 soa[i]=a[i];
23 }
24 int p=0;
25 for(int i=0;i){
26 int opt,v;
27 cin>>opt>>v;
28 while(p&&Stack[p-1].second<v){
29 p--;
30 }
31 Stack[p++]=P(opt,v);
32 }
33 int st=1,ed=Stack[0].second;
34 sort(soa+1,soa+ed+1);
35 for(int i=n;i>ed;i--){
36 ans[i]=a[i];
37 }
38 for(int i=0;i1;i++){
39 for(int j=Stack[i].second;j>Stack[i+1].second;j--){
40 ans[j]=Stack[i].first==1?soa[ed--]:soa[st++];
41 }
42 }
43 for(int i=Stack[p-1].second;i>=1;i--){
44 ans[i]=Stack[p-1].first==1?soa[ed--]:soa[st++];
45 }
46 for(int i=1;i<=n;i++){
47 cout<" ";
48 }
49 return 0;
50 }
View Code

 


推荐阅读
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
author-avatar
我是田小勇2702932553
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有