一起开心寒假训练总复习

文章目录

  • 畅通工程
    • 题意:
    • 题解:
    • 代码:
  • 小希的迷宫
    • 题解:
    • 代码:
  • Express Mail Taking
    • 题意:
    • 题解:
    • 代码:
  • Reports
    • 题意:
    • 题解:
    • 代码:
  • 放苹果
    • 题意:
    • 题解:
    • 代码:
  • Monthly Expense
    • 题意:
    • 题解:
    • 代码:
  • String Typing
    • 题意:
    • 题解:
    • 代码:
  • Diagonal Walking
    • 题意:
    • 题解:
    • 代码:

畅通工程

题意:

最少建多少道路使得两两城镇之间都能连通

题解:

利用并查集
题意很清楚,我们来分析下例子:第一行告诉你,一共有4个点,2条路。下面两行告诉你,1、3之间有条路,4、3之间有条路。那么整幅图就被分成了1-3-4和2两部分。只要再加一条路,把2和其他任意一个点连起来,畅通工程就实现了,那么这个这组数据的输出结果就是1。

那该怎么办呢?可以运用学过的并查集啊!给每个父数组一个初值-1,代表尚未与其他路接通,每连通一个路,便将-1置去,因此和普通并查集不同的地方为初始化应为如下:

for(int i=0;i<=n;i++)pre[i]=-1;

此时Find函数应为:

int Find(int x)
{if(pre[x]==-1) return x;return pre[x]=Find(pre[x]);

然后即可简单的写出程序,需要注意的是,需要创建的边数永远为城镇数减一,然后永远有一个根节点未置去-1,程序如下

代码:


#include<cstdio>
int pre[1010];
int find(int a)//find函数查找他的领导 
{int leader=a;while(pre[leader]!=leader)//领导不是自己,找自己的上一级领导 leader=pre[leader]; int t,b=a;while(b!=leader){t=pre[a];pre[a]=leader;b=t;}return leader;
}
int main()
{int n,m,point1,point2,all,lead1,lead2;//point表示城镇编号 while(scanf("%d",&n),n){all=n-1;//n个点不连成环需要n-1条边 for(int i=1;i<=n;i++){pre[i]=i;//初始化为自己的领导是自己 }scanf("%d",&m);for(int j=0;j<m;j++){scanf("%d%d",&point1,&point2);lead1=find(point1);lead2=find(point2);if(lead1!=lead2){pre[lead2]=lead1;all--;//根据题目给出的条件每连通一条总数减一 }}printf("%d\n",all);}return 0;
}

小希的迷宫

题解:

该题用并查集做难度不大,判断是否成环即判断是否要合并的两个结点的根结点相同即可,因此稍稍改变了一下join函数。
需要注意的是还有一点是每个房间必须连通,这一点我一开始忽视了于是过样例却WA(因为样例都是保证全连通);

代码:

#include<bits/stdc++.h>
using namespace std;
int pre[100005];
bool vis[100005];int find(int x){int r = x;while(pre[r] != r){r = pre[r];}int i = x, j;while(i != r){j = pre[i];pre[i] = r;i = j;}return r;
}bool join(int x, int y){int i = find(x), j = find(y);if (i != j){pre[j] = i;return true;}else return false;
}int main()
{int a, b;while(scanf("%d%d", &a, &b) != EOF){for (int i = 1; i <= 100005; ++i) pre[i] = i;memset(vis, 0, sizeof(vis));if (a == -1 && b == -1) break;if (a == 0 && b == 0){printf("Yes\n");continue;}bool flag = 1;while(a != 0){vis[a] = vis[b] = 1;//判断是否成环if(!join(a, b)) flag = 0;scanf("%d%d", &a, &b);}int root = 0;//判断是否全连通for (int i = 1; i <= 100005; ++i)if (vis[i] && pre[i] == i) ++root;if (root > 1) flag = 0;if (flag) printf("Yes\n");else printf("No\n");}return 0;
}

Express Mail Taking

题意:

现在有n个柜子依次排列,这些柜子编号从1~n。每个柜子之间距离为1 ,其中柜子编号为k的是特殊的,这是个密码柜,要向打开其他柜子就必须在这个柜子输入密码。现在你有m个快递在这些柜子中,你从入口进入,取完快递后从入口出来,问你需要走的最小距离。

题解:

贪心做法:
由于这些快递这件是没有关联的,所以这道题是非常简单的,在没有取完快递之前我们都需要先去密码柜再输入密码再去取快递,这些步骤都是等效的。 那么这道题为什么会有最小距离呢?重要的就是在取最后一个快递的时候,我们取完最后一个快递是不是没必要回到密码柜了,直接走到出口,故:最后一个快递的位置显得极为重要,这也是决定性因素。所以我们想要让最后一个快递的位置靠近入口即可。此题则易解。

代码:

#include<bits/stdc++.h>	//POJ不支持#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pairusing namespace std;const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e6;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll>  pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为自定义代码模板***************************************//ll t,n,m,k;
ll a[maxn];
int main(){//freopen("in.txt", "r", stdin);//提交的时候要注释掉IOS;while(cin>>t){while(t--){cin>>n>>m>>k;rep(i,0,m-1){cin>>a[i];}sort(a,a+m);ll ans=k-1;per(i,m-1,1){ans+=abs((a[i]-k)*2);}if(a[0]<=k)ans+=k-1;else{ans+=abs((a[0]-k)*2)+k-1;}cout<<ans<<endl;}}return 0;
}

Reports

题意:

给你某一天的报告,在这一天总共报告n nn次,其中1 11表示入校,0 00表示离校,当且仅当不连续存在两个相同的报告类型时这份报告才算正确。现在请你判断这份报告是否有误。

题解:

根据题意,直接判断是否有相邻元素相等就行

代码:

#include<bits/stdc++.h>	#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pairusing namespace std;const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e5;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll>  pll;
typedef pair<int, int> pii;int t,n;
int a[maxn];
int main(){//freopen("in.txt", "r", stdin);//提交的时候要注释掉IOS;while(cin>>t){while(t--){cin>>n;rep(i,0,n-1){cin>>a[i];}bool flag=false;rep(i,0,n-2){if(a[i]==a[i+1]){flag=true;break;}}if(flag)cout<<"NO"<<endl;elsecout<<"YES"<<endl;}}return 0;
}

放苹果

题意:

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

题解:

:首先,设 i个苹果放在 k个盘子里的放法总数是 f(i,k) ,分类讨论有两种情况
(1)当 k > i 时,f ( i , k ) = f ( i , i )
(2)当 k <= i时,总放法 = 有盘子为空的放法+没盘子为空的放法
f ( i , k ) = f ( i , k - 1 ) + f ( i - k , k )

代码:

#include<iostream>
using namespace std;
//设 i个苹果放在 k个盘子里的放法总数是 f(i,k) 
int f(int i,int k){if(k > i){//当 k > i时,f(i,k) = f(i,i) return f(i,i);}if(i == 0)return 1;if(k == 0){return 0;}//k <= i时,总放法 = 有盘子为空的放法+没盘子为空的放法//f(i,k) = f(i,k-1) + f(i-k,k) return f(i,k-1)+f(i-k,k);
}int main(){int t,i,k,count=0;cin>>t;while(t--){cin>>i>>k; cout<<f(i,k)<<endl;}return 0;
} 

Monthly Expense

题意:

给出农夫在n天中每天的花费,要求把这n天分作m组,每组的天数必然是连续的,要求分得各组的花费之和应该尽可能地小,最后输出各组花费之和中的最大值

题解:

各组最小和的最大值应该用二分做,枚举一个答案,然后验证是否合理,不断缩小范围最后确定答案

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 100001
#define MOD 123
#define E 1e-6
using namespace std;
int n,m;
int a[N];
bool judge(int value)//判断当前花费可把n分成几组
{int sum=0;//花费总和int cnt=1;//初始时只有一组for(int i=0;i<n;i++)//枚举每天花费{if(sum+a[i]<=value)sum+=a[i];else{sum=a[i];cnt++;}}if(cnt>m)//若分组数比规定数要多,则mid偏小,需调整左值return false;else//若分组数比规定数要少,则mid偏大,需调整右值return true;
}
int main()
{while(scanf("%d%d",&n,&m)!=EOF){int left=0,right=0;for(int i=0;i<n;i++){scanf("%d",&a[i]);left=max(left,a[i]);right+=a[i];}int mid;while(left<=right){mid=(left+right)/2;if(judge(mid))right=mid-1;elseleft=mid+1;}printf("%d\n",mid);}return 0;}

String Typing

题意:

给一个字符串,可以复制某一段字符,问最少需要多少步能将其输出,比如abcabcd,先输入abc然后再赋值abc再输入d就只需要5步。
复制的这段字符 必须是从字符串的0位置开始复制的 而且只能粘贴一次 例abcabcabc 输出为7

题解:

string中的str.substr(i,j) 截取字符串str第i位置开始的长度为j的一段字符
从开始截取长度为i的一段,看是否和后面有重复的

代码:

#include <bits/stdc++.h>
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = 10010, INF = 0x7fffffff;int main()
{int n;string str;cin>> n >> str;int res = n;for(int i=1; i<=n/2; i++)if(str.substr(0, i) == str.substr(i, i)) res = n - i + 1;cout<< res <<endl;return 0;
}

Diagonal Walking

题意:

给出n个操作,相连的U和R 可以看为一步,问一共多少步

题解:

直接按照题目模拟即可,遇到UR或者RU就跳过,其他的计算步数

代码:

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main(){int n;cin >> n;string s;cin >> s;int u = 0, r = 0, ans = 0;int len = s.size();for(int i = 0; i < s.size(); i++){if((s[i] == 'U' && s[i+1] == 'R') || (s[i] == 'R' && s[i+1] == 'U')){i++;  // 相连的U和R看为一步}ans++;}cout << ans << endl;return 0;
}

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

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

相关文章

YBTOJ:放置棋子(费用流)

文章目录题目描述解析代码题目描述 有一个n*n的棋盘&#xff0c;可以在上面放棋子。 有些格子不能放棋子&#xff0c;有些格子必须放棋子&#xff0c;剩下的格子随意。 要求放好棋子之后满足如下两条要求&#xff1a; 第 i 行和第 i 列的棋子数目必须一样多。 第 i 行的棋子数…

Prufer 序列

Prufer 序列 定义与建立 Prufer 序列可以将一个带标号 \(n\) 个结点的树用 \([1,n]\) 中的 \(n-2\) 个整数表示。一个无向带标号生成树与数列之间的双射。 对于一棵树&#xff0c;每次我们选择它编号最小的叶子结点&#xff0c;删除它并记录下与它相连的节点的编号&#xff0c;…

CF476D-Dreamoon and Sets【结论】

正题 题目链接:https://www.luogu.com.cn/problem/CF476D 题目大意 求nnn个四元组使得 所有四元组内没有重复的数。四元组内的数字两两之间gcdgcdgcd都为kkk。 要求使得最大的数字最小 1≤n≤10000,1≤k≤1001\leq n\leq 10000,1\leq k\leq 1001≤n≤10000,1≤k≤100 解题思…

使用 WRK 压力测试工具对 ASP.NET Core 的接口进行压力测试

0. 简要介绍WRK 是一款轻量且易用的 HTTP 压力测试工具&#xff0c;通过该工具我们可以方便地对我们所开发的 WebAPI 项目进行压力测试&#xff0c;并且针对测试的情况返回结果。PS&#xff1a;Wrk 并不能针对测试的结果生成动态的图表&#xff0c;如果有这种需要&#xff0c;可…

Codeforces Round #696

Codeforces Round #696 文章目录CF1474A Puzzle From the Future题意&#xff1a;题解&#xff1a;代码&#xff1a;CF1474B Different Divisors题意&#xff1a;题解&#xff1a;代码&#xff1a;CF1474C Array Destruction题意&#xff1a;题解&#xff1a;代码&#xff1a;C…

YBTOJ洛谷P4068:数字配对(网络流)

文章目录题目描述解析代码题目描述 有n种数字&#xff0c;第 i 种数字是 ai&#xff0c;有 bi个&#xff0c;权值是 ci。 若两个数字 ai,aj 满足&#xff0c; ai 是 aj 的倍数&#xff0c;且 ai/aj 是一个质数&#xff0c;那么这两个数字可以配对&#xff0c;并获得 ci*cj 的…

Comet OJ(Contest #14)-飞翔的小鸟【tarjan】

正题 题目链接:https://www.cometoj.com/contest/73/problem/E?problem_id4124 题目大意 给出nnn个点mmm条边的一张有向图&#xff0c;边有边权&#xff0c;qqq次询问从点111走到点xxx的所有路径&#xff08;可以重复经过任何点包括点xxx&#xff09;中极差最大是多少。 1≤…

[TJOI2019]唱、跳、rap和篮球(指数型生成函数+NTT+卷积)

文章目录题目题解code1&#xff08;NTT&#xff09;code2&#xff08;EGF卷积&#xff09;题目 大中锋的学院要组织学生参观博物馆&#xff0c;要求学生们在博物馆中排成一队进行参观。他的同学可以分为四类&#xff1a;一部分最喜欢唱、一部分最喜欢跳、一部分最喜欢rap&…

数数题(计数类 DP)做题记录

数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当&#xff1a;所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和。 完全图点数为 \(n\)&#xff0c;边权 \(\in[1,k]\)&#xff0c;\(1\le n,k\le 250\)。 发现所有和 \(1\)…

Sum of Paths CodeForces - 1467D

Sum of Paths CodeForces - 1467D Tagscombinatorics dp math *2200 题意&#xff1a; 定义一条好的路径&#xff0c;当且仅当从任意点出发之后恰好经过了 k 次移动&#xff0c;定义这条路径的权值为经过点权值的总和(可重)&#xff0c;进行 q 次修改&#xff0c;每次将ak 改…

[矩阵乘法/快速幂专题]Arc of Dream,Recursive sequence,233 Matrix,Training little cats

矩阵快速幂习题复习矩阵乘法及快速幂模板乘法模板快速幂模板T1&#xff1a;Arc of Dream题目题解codeT2&#xff1a;Recursive sequence题目题解codeT3&#xff1a;233 Matrix题目题解codeT4&#xff1a;Training little cats题目题解code做题的时候后悔没有保存过模板&#xf…

P3639-[APIO2013]道路费用【最小生成树】

正题 题目链接:https://www.luogu.com.cn/problem/P3639 题目大意 给出nnn个点mmm条有边权的无向图&#xff0c;然后再给出kkk条边权未定义的边&#xff0c;然后每个点有一个人数pip_ipi​。 现在要你给未确定的边权的边确定边权然后选出图的一棵最小生成树&#xff0c;之后…

你准备好了在云中工作吗?

前几天写了一篇文章 《云时代的.NET》&#xff0c;今天继续这个话题聊下云时代的技能。无服务器计算&#xff0c;容器化&#xff0c;云原生应用&#xff0c;DevOps&#xff0c;人工智能&#xff0c;机器学习以及混合云和多云解决方案等IT趋势正在成为主流或“新常态”。所有大小…

珂朵莉树(ODT)

珂朵莉树 ODT 主要内容 珂朵莉树是基于数据随机且有整体赋值操作而对序列操作的乱搞算法。 它的主要思想是用 set 维护若干个数值上相同的区间&#xff0c;并暴力处理其他询问。 建立 在 set 中&#xff0c;我们需要用结构体记录每个区间的信息&#xff1a; struct NODE {int l…

最长公共上升子序列(LCIS)

题意&#xff1a; 求最长公共上升子序列 题解&#xff1a; 最长公共上升子序列 最长公共子序列&#xff08;LCS&#xff09;与最长上升子序列&#xff08;LIS&#xff09; LCS核心代码&#xff1a; for(int i1;i<n;i){for(int j1;j<m;j){if(a[i]b[j])dp[i][j]max(dp[…

YBTOJ洛谷P1407:稳定婚姻(强连通分量)

文章目录题目描述解析代码题目描述 我们已知n对夫妻的婚姻状况&#xff0c;称第 i 对夫妻的男方为 Bi &#xff0c;女方为 Gi。 若某男 Bi 与某女 Gi 曾经交往过( i!j )&#xff0c;则当某方与其配偶&#xff08;即 Bi 与 Gi 或 Bj 与 Gj&#xff09;感情出现问题时&#xff…

[高斯消元及理论]线性方程组整数/浮点数,模线性方程组,异或方程组模板

文章目录理论线性方程组整数类型解线性方程组浮点类型解模线性方程组异或方程组高斯约旦消元约旦消元无解无穷解唯一解理论 高斯消元法&#xff0c;是线性代数规划中的一个算法&#xff0c;可用来为线性方程组求解。但其算法十分复杂&#xff0c;不常用于加减消元法&#xff0c…

eShopOnContainers 知多少[7]:Basket microservice

引言Basket microservice&#xff08;购物车微服务&#xff09;主要用于处理购物车的业务逻辑&#xff0c;包括&#xff1a;购物车商品的CRUD订阅商品价格更新事件&#xff0c;进行购物车商品同步处理购物车结算事件发布订阅订单成功创建事件&#xff0c;进行购物车的清空操作架…

P6805-[CEOI2020]春季大扫除【贪心,树链剖分,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P6805 题目大意 给出nnn个点的一棵树&#xff0c;qqq次独立的询问。每次询问会在一些节点上新增一些子节点&#xff0c;然后你每次可以选择两个为选择过的叶子节点然后覆盖它们的路径&#xff0c;要求在覆盖所有边的情况下使…

后缀数组 SA

后缀数组 SA 后缀树组(SA&#xff0c;suffix array)&#xff0c;用于处理字符串子串形成的结构。 处理子串的结构主要方式有&#xff1a;后缀数组 SA&#xff0c;后缀自动机 SAM&#xff0c;后缀树 ST。 后缀树和后缀自动机暂时决定咕咕咕&#xff0c;以后学习可以参考ix35 的字…