Acwing4440. 照相
拍照
Acwing4440. 照相原题链接
2023.7.12
1 暴力递推
1递推法
思路是每一头奶牛都翻转一次
统计翻转前和翻转后 两次位于偶位置的G奶牛的数量,若是翻转后数量多,那么就保持反转 要是翻转后数量好,就再翻转回去
!!!注意,这是错误的代码,甚至样例都没有过
本菜菜还没有找到更正的方法,欢迎并跪求路过的大佬指出错误,谢谢!!
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>using namespace std;
const int N=1001010;
int n;//奶牛的个数
char breed[N];//输入奶牛的序列
int res;//统计反转的次数
int sum1; //统计反转前G奶牛位于偶位置的个数
int sum2; //统计反转后G奶牛位于偶位置的个数
int main(){cin>>n;for(int i=0;i<n;i++)cin>>breed[i];for(int i=0;i<n;i++){if(breed[i]=='G'&&(i+1)%2==0)sum1++;//如果G奶牛位于偶位置,sum1++,统计个数reverse(breed,breed+i);res++;//判断反转后跟翻转前位于偶位置的G奶牛的个数for(int c=0;c<=i;c++){if(breed[c]=='G'&&(c+1)%2==0)sum2++;}if(sum1>=sum2){reverse(breed,breed+i);res--;//如果翻转后比反转少,那再翻转回去//对应反转次数回到没反转的时候}sum2=0;}//GGGHGHHGHHHGHG (反转前)
// -> HGHGGGHGHHHGHG (反转后)// for(int i=0;i<n;i++)cout<<breed[i];cout<<res;return 0;
}
2 递归法(会超时)
这个方法的思路主要是用Acwing92. 递归实现指数型枚举的思路实现的
(也算是一种活学活用吧嘿嘿)(菜菜的自我幻想)
利用递归的思想,将所有种可能的组合进行判断,判断哪一种组合的G奶牛在偶数位置数目最多而且翻转次数最小
因为本菜菜不懂如何记录并使用上一次递归过程中的sum
就没办法在得出sum最大的时候,比较res最小
只好分了两个递归,一个记录最大sum(偶数位置G奶牛的最大数目)
一个记录符合sum的最小res(翻转次数)
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<limits.h> //最大最小数 INT_MIN INT_MAXusing namespace std;
const int N=110010;
int n; //奶牛的总数目
char breed[N];//输入奶牛的序列
int sum;//统计符合条件的奶牛数目(位于偶位置的G奶牛)
int res; //统计反转次数int sum1;//统计最大偶位置的奶牛的数目int minres=INT_MAX;//记录符合sum最大条件下的最小res;
//minres初始值要很大,因为用的是min函数,初始值如果为0 那么全是0void Maxsum(int u){if(u>n-1){ //终止条件for(int i=0;i<n;i++)if(breed[i]=='G'&&i%2==1)sum++; //统计站在偶数位置的奶牛sum1=max(sum,sum1);//记录可以站在偶数位置的G奶牛最多有多少头sum=0; //初始化下次递归过程的sumreturn ;//一定要记得强制返回哦}//原理参考Acwing92.递归实现指数型枚举Maxsum(u+1); //不反转reverse(breed,breed+u+1); //翻转Maxsum(u+1);
}//写两个递归 第一个用来求出奶牛站在偶数位置的可能做大值
// 第二个用来求符合最大sum的最小res
void Minres(int u){if(u>n-1){ //终止条件for(int i=0;i<n;i++)if(breed[i]=='G'&&i%2==1)sum++; //i是从0开始的if(sum!=sum1) {sum=0; return ; } //如果sum不是最大值,直接返回 省时间minres=min(res,minres); res=0;//重新初始化sum和res不要影响下一次的ressum=0;return ;}Minres(u+1); //不反转reverse(breed,breed+u+1); //翻转 //reverse是左闭右开res++; //只有翻转res才会+1Minres(u+1);
}int main(){cin>>n>>breed;Maxsum(0);//从第零层开始sum=0;res=0; //防止影响新递归Minres(0);cout<<minres;return 0;
}
注意reverse是左闭右开!!!!!!!!
3 正确思路分析
先看图
思路的是
我们发现,因为数据本身一定是偶数,如果我们把每两个数据看做一组,
比如11 00 10 01
每次翻转,小组内的结果与其他小组是互相独立的,是不会彼此影响的
所以可以安心的只考虑这一组的情况
我们发现,处于第二个位置,一定是偶数位置,处于第一个位置,一定是奇数位置(这里仅考虑一个小组内的情况),所以我们考虑可以把所有的第二个位置的G翻转到第一个位置。
但是GH表示太过于复杂,我们考虑数学方法里的换元,用1表示GH,用0
表示HG,HH和GG这两种情况无论如何翻转是都不会变的,所以我们只需要考虑将所有的1变成0即可
假设数据是001,我们可以把1前面的0都转为1
即成为111,再把所有的111转换成0
即为000
这样就得到了1变为0的操作
以此类推,后续的所有的1都可以由这种操作转换
最后我们发现,实际统计最少的翻转次数,我们只需要考虑两个相邻的数字是否相同,相同则不用翻转。不同则需要反转一次,
由此,我们只需要统计相邻数字不相同的情况即可
举例说明
101
实际有三个不同的间隔(我们自动给最后一个一后面虚拟添加一个0也就是1010)
所以只需要反转三次即可
4 正确代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>using namespace std;const int N=200100;
int n; //奶牛的数目
char breed[N];//记录奶牛的序列
int arr[N]; // 记录0 1数串
int j; //arr数组的下标索引
int res; //记录符合条件的数目
int main(){cin>>n>>breed;for(int i=0;i<n;i+=2){//只考虑HG和GH这两种情况if(breed[i]=='G'&&breed[i+1]=='H')arr[j++]=1;if(breed[i]=='H'&&breed[i+1]=='G')arr[j++]=0;}for(int i=0;i<j;i++){ //按理说需要单独考虑最后一种,但是因为数组后面是许多个0,所以不用单独考虑if(arr[i]!=arr[i+1])res++;}cout<<res;return 0;
}
Acwing4440. 照相相关推荐
- 捕获Camera并保存图片到本地(照相功能) -samhy
Flex博文 捕获Camera并保存图片到本地(照相功能) -samhy 作者:admin 日期:2010-07-12 字体大小: 小 中 大 捕获Camera并保存图片到本地(照相功能) 这几天对C ...
- android webview拍照,在android 2.2/2.3中使用webview从camera中照相并且上传的实现
最近做了需要实现一个小功能,在安卓的离线数据录入程序中,要支持文件的的上传.简单而言,就是在一个webview包装起来的离线的Web App中,通过input[type=file]的指定需要上传的文件 ...
- Android简单调用相机Camera功能,实现打开照相功能
在最开始接触Android相机功能之前,先来体验一下Android调用系统照相功能吧 核心代码 Intent intent = new Intent(); //调用照相机 intent.setActi ...
- Acwing 271. 杨老师的照相排列
Acwing 271. 杨老师的照相排列 题意: 有n个数分别是从1到n,现在排成k排,每排分别有Ci个数,要求每排每列的都是从小到大,问有多少种方案 题解: 因为每行每列都是单调的,因此我们可以从小 ...
- 高德地图各种摄像头图标_高德地图Overlay的应用以及照相功能的实现
暑假第二十一天,今天天气有点小热,长时间对着电脑眼睛还真有点不适应,下午刚刚出地下室吃饭的时候,两眼眺望了一下远方,就感觉小有压力,眼睛和头都有点不舒服,哎!程序员真苦逼啊!!!伤不起的还是我们这群程 ...
- 苹果6s照相快门声音设置_苹果手机配件常见故障及维修注意事项
之前有给大家分享关于屏幕的一些知识,然后就有朋友私信我一些关于维修的小知识.这方面嘛我只是略懂皮毛,没办法只得去求公司的老师傅来说说了. 因为老师傅碰到的手机大多是iPhone,这里就大概讲一下苹果手 ...
- 红米note3照相数据丢失
红米note3及个别手机在调用相机拍照时,点击拍照,如果关闭闪光灯,拍照会卡顿一下,接着屏幕白屏,之后是截屏界面.虽然可以截屏,也可以显示在imageview上.但是界面的数据丢了.查了很多资料.有的 ...
- iphone6 计算机无法检测到照相机,苹果iPhone XR摄像头黑屏不能照相是什么原因?...
今天接到客户电话,说自己买了没多久的xr出现问题了,不能照相,后置摄像头照相用不了,点不开了,只有前置摄像头可以用,手电筒也打不开这是为什么?其实,摄像头故障是手机使用问题中比较常见的.今天,海口苹果 ...
- android+照相软件,韩国很火的照相app
韩国很火的照相app为大家推荐SNOW相机,一直排行于苹果应用市场前三位,这款软件在当前国内也有着极大的用户需求,其独特的变脸功能与美颜效果,加之全球推广,让它成为了当前世界级的相机软件之一. 应用简 ...
最新文章
- Antenna Placement--POJ 3020
- 【求助】哪个软件负责在屏幕右下角显示类似“caps lock on/off”的? - 技术封存区 - 专门网论坛 -...
- 如何在SQL Server中使用触发器
- java集合对象声明_Java基础————集合类
- linux阿帕奇日志文件,Linux下apache日志文件设置
- 安装 Tensorflow
- java基础代码实例_java学习之web基础(3):Servlet 和 Request的登录处理实例
- 周志华教授专著《集成学习:基础与算法》上市,豆瓣满分森林书破解AI实践难题
- securitytube视频列表
- MarkDown 内部跳转链接
- 在国企的日子(第六章 大赛)
- 怎么修复计算机硬件,Win10有哪些硬件诊断工具 硬件出现问题如何查看修复
- 【软件开发】Java语言的简单介绍
- 微信电脑端【多开问题】+附赠,解决桌面图标变小白块问题
- imperva agent 的重新注册
- uni发行小程序报错app.json找不到,运行没问题
- qq协议 0825 和 0836 udp 登录包解析
- java坦克大战总体功能设计_Java编程:坦克大战游戏的设计
- android开源项目大集合
- STM32 ADS8365 高精度 ADC 采集方案
热门文章
- Java程序员必修内功心法!(内功修炼第一层)
- mapboxgl 飞线
- 健康体检中心与医院的差别?
- 编程笔记1:使用c语言编译器
- Chrome看视频站Flash很卡的解决方法
- 在微型计算机中 常见到,在微型计算机中,常见到的EGA、VGA等是指()。
- 在 JavaScript 中三个点‘...‘的意思
- Windows系统 命令行修改默认的TTL值 不用重启的方法
- Ubuntu 19 忘记登陆密码重设密码
- php stripos 返回值,PHP stripos() 函数