2022寒假集训day6
day6
上午还是做四道题
T1
区域
【上机练习】
1、编程计算由“*”号围成的下列图形的面积。面积计算方法是统计*号所围成的闭合曲线
中水平线和垂直线交点的数目。如下图所示,在 10*10 的二维数组中,有“*”围住了 15
个点,因此面积为 15。
【样例输入】area.in
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0
0 0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 0 1 0
0 0 1 0 0 0 1 0 1 0
0 1 0 1 0 1 0 0 1 0
0 1 0 0 1 1 0 1 1 0
0 0 1 0 0 0 0 1 0 0
0 0 0 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0
【样例输出】area.out
15
#include <bits/stdc++.h>
using namespace std;
int a[12][12];
int main()
{
int sum=0;
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
a[i][j]=0;
for(int i=0;i<12;i++)
{
a[i][0]=-1;
a[0][i]=-1;
a[i][11]=-1;
a[11][i]=-1;
}
for(int i=1;i<11;i++)
for(int j=1;j<11;j++)
{
cin>>a[i][j];
}
for(int i=1;i<11;i++)
for(int j=1;j<11;j++)
{
if(a[i][j]==0&&a[i-1][j]==-1)
a[i][j]=-1;
if(a[i][j]==0&&a[i][j-1]==-1)
a[i][j]=-1;
if(a[i][j]==0&&a[i+1][j]==-1)
a[i][j]=-1;
if(a[i][j]==0&&a[i][j+1]==-1)
a[i][j]=-1;
}
for(int j=1;j<11;j++)
for(int i=1;i<11;i++)
{
if(a[i][j]==0&&a[i-1][j]==-1)
a[i][j]=-1;
if(a[i][j]==0&&a[i][j-1]==-1)
a[i][j]=-1;
if(a[i][j]==0&&a[i+1][j]==-1)
a[i][j]=-1;
if(a[i][j]==0&&a[i][j+1]==-1)
a[i][j]=-1;
}
for(int i=1;i<11;i++)
for(int j=1;j<11;j++)
{
if(a[i][j]==0)
sum++;
}
cout<<sum;
}
整道题给人一种看的很明白,但是没有思路写;
关键在我这道题没用搜索还做了出来(doge
————————————————————————————————————————
T2
奇怪的电梯 洛谷P1135
2、奇怪的电梯(lift)
【问题描述】
大楼的每一层楼都可以停电梯,而且第 i 层楼(1<=i<=N)上有一个数字 Ki(0<=Ki<=N)。
电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果
不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5 代表了 Ki(K1=3,K2=3,......),从一
楼开始。在一楼,按“上”可以到 4 楼,按“下”是不起作用的,因为没有-2 楼。那么,
从 A 楼到 B 楼至少要按几次按钮呢?
【输入格式】
输入文件共有二行,第一行为三个用空格隔开的正整数,表示 N,A,B(1≤N≤200, 1 ≤
A,B≤N),第二行为 N 个用空格隔开的正整数,表示 Ki。
【输出格式】
输出文件仅一行,即最少按键次数,若无法到达,则输出-1
#include<bits/stdc++.h>
using namespace std; int n,A,B,cnt=10001;
int k[210];
bool b[210]={0};
int d[2]={1,-1}; void dfs(int x,int s)
{
if(x==B) cnt=min(s,cnt);
if(s>cnt) return; for(int i=0;i<2;i++){
int X=x+d[i]*k[x];
if(X>=1 && X<= n && b[X]){
s++;
b[x]=false;
dfs(X,s);
b[x]=true;
s--;
}
}
} int main(){
cin>>n>>A>>B; memset(b,true,sizeof(b));
for(int i=1;i<=n;i++) cin>>k[i]; b[A]=false;
if(A==B) cnt=0;
else dfs(A,0);
if(cnt==10001) cout<<-1;
else cout<<cnt;
return 0;
}
反复提交了好几次才发现少了memset(b,true,sizeof(b));
一直二十分。整体来说还是标准的深搜。
————————————————————————————————————————
T3
产生数 洛谷P1037
题目描述
给出一个整数 nnn(n<1030n \lt 10^{30}n<1030)和 kkk 个变换规则(k≤15k \le 15k≤15)。
规则:
- 一位数可变换成另一个一位数。
- 规则的右部不能为零。
例如:n=234n=234n=234。有规则(k=2k=2k=2):
- 222->555
- 333->666
上面的整数 234234234 经过变换后可能产生出的整数为(包括原数):
- 234234234
- 534534534
- 264264264
- 564564564
共 444 种不同的产生数。
现在给出一个整数 nnn 和 kkk 个规则。求出经过任意次的变换(000次或多次),能产生出多少个不同整数。
仅要求输出个数。
输入格式
第一行两个整数 n,kn,kn,k。
接下来 kkk 行,每行两个整数 xi,yix_i,y_ixi,yi。
输出格式
输出能生成的数字个数。
#include<iostream>
using namespace std;
string n;
int k,can[10][10];
int ans[500]={1};
int l=1,b[10]; void dfs(int x)
{
for(int i=0;i<l;i++)
ans[i]*=x;
for(int i=0;i<l;i++)
if(ans[i]>=10)
{
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
while(ans[l]>0)
{
ans[l+1]=ans[l]/10;
ans[l]=ans[l]%10;
l++;
}
}
int main()
{
cin>>n>>k;
int x,y;
while(k--)
{
cin>>x>>y;
can[x][y]=1;
}
for(int v=0;v<10;v++)
for(int j=0;j<10;j++)
for(int i=0; i<10; i++)
if(i!=j&&j!=v&&i!=v)
if(can[i][v]==1&&can[v][j]==1) can[i][j]=1; int len=n.length();
for(int i=0; i<len; i++)
{
int n1=n[i]-'0',change=1;
for(int j=0;j<10;j++)
if(can[n1][j]==1&&n1!=j)
change++;
b[n1]=change;
}
for(int i=0;i<len;i++) dfs(b[n[i]-'0']);
for(int i=l-1;i>=0;i--) cout<<ans[i];
return 0;
}
颇为麻烦的一道题
第一眼上去以为会有规律,结果自己找了几个数据自己算,发现竟然是递推(bushi)。就写个提交,洛谷给我20分,竟然骗到了。
言归正传,首先搜索规则中可以变换的情况,还要用10来取模,如果发现得出的数与之前的相同,不能sum++了
————————————————————————————————————————
T4
家庭问题
【问题描述】
有 n 个人,编号为 1,2,......n,另外还知道存在 K 个关系。一个关系的表达为二元组(α,
β)形式,表示α,β为同一家庭的成员。
当 n,k 和 k 个关系给出之后,求出其中共有多少个家庭、最大的家庭中有多少人?
例如:n=6,k=3,三个关系为(1,2),(1,3),(4,5)
此时,6 个人组成三个家庭,即:{1,2,3}为一个家庭,{4,5}为一个家庭,{6}单独为
一个家庭,第一个家庭的人数为最多。
【输入格式】
文件的第一行为 n,k 二个整数(1≤n≤100)(用空格分隔)
接下来的 k 行,每行二个整数(用空格分隔)表示关系
【输出格式】
二个整数(分别表示家庭个数和最大家庭人数)
#include <bits/stdc++.h>
using namespace std;
int n,k;
int a,b;
int p[120],sum[120];
int search(int x){
if(p[x]!=x) p[x]=search(p[x]);
return p[x];
}
int main(){
cin>>n>>k;
int family=n;
int number=1;
for(int i=1;i<=n;i++){
p[i]=1;
p[i]++;
sum[i]=1;
}
while(k--){
cin>>a>>b;
a=search(a),b=search(b);
if(a!=b){
p[a]=b;
sum[b]+=sum[a];
family--;
number=max(number,sum[b]);
} }
cout<<family<<" "<<number;
return 0;
}
很正经的搜索回溯啦,
对家庭数和人数进行初始化,如果发现输入中重复出现的元素,说明二者可以算到一起(也就是合为一家)
计数也就减少一个,人数++。
2022寒假集训day6的更多相关文章
- 2022寒假集训day2
day1:学习seach和回溯,初步了解. day2:深度优化搜索 T1 洛谷P157:https://www.luogu.com.cn/problem/P1157 题目描述 排列与组合是常用的数学方 ...
- HZNU-ACM寒假集训Day6小结 线性DP
线性DP 考虑一组硬币面值 1,5,11 给定W,求凑出W的最少硬币个数 我们记凑出n需要用到的最少硬币数量为f(n) 我们注意到了一个很棒的性质 : f(n)只与f(n-1) f(n-5) f( ...
- 2022寒假集训day5
day5 五道栈的题加上字符串. 单调队列. T1 表达式括号匹配 洛谷P1739 题目描述 假设一个表达式有英文字母(小写).运算符(+,-,*,/)和左右小(圆)括号构成,以"@&q ...
- 2022寒假集训day4
day4(day5补完的) 继续刷搜索方面的题, 初步了解了序列. T1 迷宫问题 题目描述设有一个 n*n 方格的迷宫,入口和出口分别在左上角和右上角.迷宫格子中分别放 0 和 1 ,0 表示可通, ...
- 2022寒假集训day3
day3:四道检测题,花了大半天时间. T1 子集和问题 问题描述 子集和问题的一个实例为<S,c>.其中S={x1,x2,-,xn}是一个正整数的集合,c是一个正整数.子集和问题判定是否 ...
- LOJ #6074. 「2017 山东一轮集训 Day6」子序列
#6074. 「2017 山东一轮集训 Day6」子序列 链接 分析: 首先设f[i][j]为到第i个点,结尾字符是j的方案数,这个j一定是从i往前走,第一个出现的j,因为这个j可以代替掉前面所有j. ...
- CSU-ACM寒假集训选拔-入门题
CSU-ACM寒假集训选拔-入门题 仅选择部分有价值的题 J(2165): 时间旅行 Description 假设 Bobo 位于时间轴(数轴)上 t0 点,他要使用时间机器回到区间 (0, h] 中 ...
- 2019暑期金华集训 Day6 杂题选讲
自闭集训 Day6 杂题选讲 CF round 469 E 发现一个数不可能取两次,因为1,1不如1,2. 发现不可能选一个数的正负,因为1,-1不如1,-2. hihoCoder挑战赛29 D 设\ ...
- 2019暑期金华集训 Day6 计算几何
自闭集训 Day6 计算几何 内积 内积不等式: \[ (A,B)^2\le (A,A)(B,B) \] 其中\((A,B)\)表示\(A\cdot B\). (好像是废话?) 叉积 \[ A\tim ...
随机推荐
- Solon 1.6.12 发布,类似 Spring 的生态体系
关于官网 千呼万唤始出来: https://solon.noear.org .整了一个月多了,总体样子有了...还得不断接着整! 关于 Solon Solon 是一个轻量级应用开发框架.支持 Web. ...
- 深入浏览器工作原理和JS引擎(V8引擎为例)
浏览器工作原理和JS引擎 1.浏览器工作原理 在浏览器中输入查找内容,浏览器是怎样将页面加载出来的?以及JavaScript代码在浏览器中是如何被执行的? 大概流程可观察以下图: 首先,用户在浏览器搜 ...
- Linux-saltstack-4 jinjia模板得基本使用
@ 目录 一.简介 二.jinja2语法 1.jinja2变量 1.1 配置文件中使用jinja变量 1.2在脚本中定义jinja变量 1.3在脚本中设置grains变量 例子1:单值 例子2:多值 ...
- STM32F3 GPIO的八种模式及工作原理
一.GPIO简介 GPIO(英语:General-purpose input/output),通用型之输入输出的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来 ...
- Ubuntu18.04编译Zircon
1.获取源代码 git clone https://fuchsia.googlesource.com/zircon 2.安装编译环境 sudo apt-get install texinfo libg ...
- MongoDB 安装及制作成windows服务
下载: 注:直接使用浏览器下载速度很慢,建议使用其他下载软件下载(比如:迅雷) 官网下载地址: https://fastdl.mongodb.org/win32/mongodb-win32-x86_ ...
- nginx+keepalived 简单实现主备和双主模式
准备nginx和keepalived 安装nginx(自行安装) yum install nginx 安装keepalived(安装包安装总报错,yum安装能好一点) yum install keep ...
- selenium实现并发
for循环和多线程 + selenium 实例一 for循环 # -*- coding: utf-8 -*- """ Datetime: 2019/6/22 Author ...
- 日志通过脚本导入到HDFS当中
可以关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新) 利用shell脚本定时备份日志数据到HDFS上(适合日志数据比较少的时候) 时间命令 d ...
- SYCOJ304末尾0的个数
https://oj.shiyancang.cn/Problem/304.html 首先数据范围不可能算出来的,那么就要看数的性质. 0是怎么来的首先我们知道,有一个0,就必然会有一个5和2. n!在 ...