拍照

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. 照相相关推荐

  1. 捕获Camera并保存图片到本地(照相功能) -samhy

    Flex博文 捕获Camera并保存图片到本地(照相功能) -samhy 作者:admin 日期:2010-07-12 字体大小: 小 中 大 捕获Camera并保存图片到本地(照相功能) 这几天对C ...

  2. android webview拍照,在android 2.2/2.3中使用webview从camera中照相并且上传的实现

    最近做了需要实现一个小功能,在安卓的离线数据录入程序中,要支持文件的的上传.简单而言,就是在一个webview包装起来的离线的Web App中,通过input[type=file]的指定需要上传的文件 ...

  3. Android简单调用相机Camera功能,实现打开照相功能

    在最开始接触Android相机功能之前,先来体验一下Android调用系统照相功能吧 核心代码 Intent intent = new Intent(); //调用照相机 intent.setActi ...

  4. Acwing 271. 杨老师的照相排列

    Acwing 271. 杨老师的照相排列 题意: 有n个数分别是从1到n,现在排成k排,每排分别有Ci个数,要求每排每列的都是从小到大,问有多少种方案 题解: 因为每行每列都是单调的,因此我们可以从小 ...

  5. 高德地图各种摄像头图标_高德地图Overlay的应用以及照相功能的实现

    暑假第二十一天,今天天气有点小热,长时间对着电脑眼睛还真有点不适应,下午刚刚出地下室吃饭的时候,两眼眺望了一下远方,就感觉小有压力,眼睛和头都有点不舒服,哎!程序员真苦逼啊!!!伤不起的还是我们这群程 ...

  6. 苹果6s照相快门声音设置_苹果手机配件常见故障及维修注意事项

    之前有给大家分享关于屏幕的一些知识,然后就有朋友私信我一些关于维修的小知识.这方面嘛我只是略懂皮毛,没办法只得去求公司的老师傅来说说了. 因为老师傅碰到的手机大多是iPhone,这里就大概讲一下苹果手 ...

  7. 红米note3照相数据丢失

    红米note3及个别手机在调用相机拍照时,点击拍照,如果关闭闪光灯,拍照会卡顿一下,接着屏幕白屏,之后是截屏界面.虽然可以截屏,也可以显示在imageview上.但是界面的数据丢了.查了很多资料.有的 ...

  8. iphone6 计算机无法检测到照相机,苹果iPhone XR摄像头黑屏不能照相是什么原因?...

    今天接到客户电话,说自己买了没多久的xr出现问题了,不能照相,后置摄像头照相用不了,点不开了,只有前置摄像头可以用,手电筒也打不开这是为什么?其实,摄像头故障是手机使用问题中比较常见的.今天,海口苹果 ...

  9. android+照相软件,韩国很火的照相app

    韩国很火的照相app为大家推荐SNOW相机,一直排行于苹果应用市场前三位,这款软件在当前国内也有着极大的用户需求,其独特的变脸功能与美颜效果,加之全球推广,让它成为了当前世界级的相机软件之一. 应用简 ...

最新文章

  1. Antenna Placement--POJ 3020
  2. 【求助】哪个软件负责在屏幕右下角显示类似“caps lock on/off”的? - 技术封存区 - 专门网论坛 -...
  3. 如何在SQL Server中使用触发器
  4. java集合对象声明_Java基础————集合类
  5. linux阿帕奇日志文件,Linux下apache日志文件设置
  6. 安装 Tensorflow
  7. java基础代码实例_java学习之web基础(3):Servlet 和 Request的登录处理实例
  8. 周志华教授专著《集成学习:基础与算法》上市,豆瓣满分森林书破解AI实践难题
  9. securitytube视频列表
  10. MarkDown 内部跳转链接
  11. 在国企的日子(第六章 大赛)
  12. 怎么修复计算机硬件,Win10有哪些硬件诊断工具 硬件出现问题如何查看修复
  13. 【软件开发】Java语言的简单介绍
  14. 微信电脑端【多开问题】+附赠,解决桌面图标变小白块问题
  15. imperva agent 的重新注册
  16. uni发行小程序报错app.json找不到,运行没问题
  17. qq协议 0825 和 0836 udp 登录包解析
  18. java坦克大战总体功能设计_Java编程:坦克大战游戏的设计
  19. android开源项目大集合
  20. STM32 ADS8365 高精度 ADC 采集方案

热门文章

  1. Java程序员必修内功心法!(内功修炼第一层)
  2. mapboxgl 飞线
  3. 健康体检中心与医院的差别?
  4. 编程笔记1:使用c语言编译器
  5. Chrome看视频站Flash很卡的解决方法
  6. 在微型计算机中 常见到,在微型计算机中,常见到的EGA、VGA等是指()。
  7. 在 JavaScript 中三个点‘...‘的意思
  8. Windows系统 命令行修改默认的TTL值 不用重启的方法
  9. Ubuntu 19 忘记登陆密码重设密码
  10. php stripos 返回值,PHP stripos() 函数