博客
关于我
ACM解题技巧---(尺取法)+ 题目总结
阅读量:321 次
发布时间:2019-03-04

本文共 2587 字,大约阅读时间需要 8 分钟。

今天学到了尺取这个思路,记下来。

思路 这个技巧其实就是一种。。。。像尺子一样,一段一段的去取,个人觉得这个思想真的挺不错的,思路大概就是通过数组的下标,每次去更新符合实际的左右端点的下标,不断的去更新这个ans答案!!!

第一题

题意: 给你一个长度为n的01串,然后m次转换,可以把0字符换成1,也可以把1换成0,最多 转换m次,求最后连续的0,或者连续1最长长度
思路:
第一种思路–>>>> 尺取法,答案要么就是连续的0,要么就是连续的1,所以我们先假设将0换成1,一次去遍历,遇到0,我们就cnt++,直到发现cnt>m(m是操作数),那么我们需要做的就是左边的l进行出队,左边的话,如果遇到是0,那么我们就cnt–,直到cnt<=m,然后我们每次去更新ans

AC代码

#include
using namespace std;typedef long long int ll;const int N = 2e5 + 100, maxn = 5000+10; const ll modd = 1e9+7;void read(int &x){ int f=1;x=0;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} x*=f;}void solve(){ int n, m; read(n), read(m); char s[N]; scanf("%s",s); int l = 0, r = 0, cnt = 0; int ans = 0; while(r
m){ if(s[l] == '0') cnt--; l++; } ans = max(ans,r-l+1); r++; } l = 0, r = 0, cnt = 0; while(r
m){ if(s[l] == '1') cnt--; l++; } ans = max(ans,r-l+1); r++; } printf("%d\n",ans);}int main(){ int t; read(t); while(t--){ solve(); } return 0;}

第二种思路–>>>>

第二题

题意: 给你一个矩阵,大小n,m;然后求一个字矩阵,使这个矩阵面积最小,然后空空座位的个数大于等于k,求满足的最小的面积
思路:
最简单思路就是暴力5个循环,其实我们可以这样子去想,我们先枚举这个行,或者去枚举连个列,如果枚举行,(i行到j行),剩下的就是怎么去确定这个列了,题意要求这个面积最小,我们可以去想下,然后转换成一维,剩下的就可以理解成尺子去取,每次去试探,尺子的大小就是k,不断去更新这个一维的端点就行。

AC代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PI 3.14159265358979323846using namespace std;typedef long long int ll; typedef unsigned long long int ull;template
inline T read(T&x){ x=0;int f=0;char ch=getchar(); while (ch<'0' || ch>'9') f|=(ch=='-'),ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar(); return x=f?-x:x;}const int maxn = 305;char mp[maxn][maxn];int sa[maxn][maxn];int getsum(int x1, int y1, int x2, int y2){ return sa[x2][y2] - sa[x2][y1-1] - sa[x1-1][y2] + sa[x1-1][y1-1];}int n, m, k;void solve(){ memset(sa,0,sizeof(sa)); for(int i = 1; i <= n; i++){ scanf("%s",mp[i]+1); int oo = 0; for(int j = 1; j <= m; j++){ int oo = 0; if(mp[i][j]=='.'){ oo = 1; } sa[i][j] = oo + sa[i-1][j] + sa[i][j-1] - sa[i-1][j-1]; } } int ans = 0x3f3f3f3f; for(int i = 1 ; i <= n; i++){ for(int j = i ; j <= n; j++){ int cc = 1; for(int kk = 1; kk <= m; kk++){ while(cc<=kk&&getsum(i,cc,j,kk)>=k){ ans = min(ans,(j-i+1)*(kk-cc+1)); cc++; } } } } printf("%d\n",ans); }int main(){ while(1){ read(n),read(m),read(k); if(n == m && m == k && n == 0){ break; } solve(); } return 0;}

青春只有一次,让我们撸起袖子,先AC它1000+题

持续更新中…

转载地址:http://exaq.baihongyu.com/

你可能感兴趣的文章
Nginx代理websocket配置(解决websocket异常断开连接tcp连接不断问题)
查看>>
Nginx代理初探
查看>>
nginx代理地图服务--离线部署地图服务(地图数据篇.4)
查看>>
Nginx代理外网映射
查看>>
Nginx代理模式下 log-format 获取客户端真实IP
查看>>
Nginx代理解决跨域问题(导致图片只能预览不能下载)
查看>>
Nginx代理配置详解
查看>>
Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
查看>>
Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
查看>>
nginx反向代理
查看>>
nginx反向代理、文件批量改名及统计ip访问量等精髓总结
查看>>
Nginx反向代理与正向代理配置
查看>>
Nginx反向代理及负载均衡实现过程部署
查看>>
Nginx反向代理是什么意思?如何配置Nginx反向代理?
查看>>
nginx反向代理解决跨域问题,使本地调试更方便
查看>>
Nginx反向代理配置
查看>>
Nginx启动SSL功能,并进行功能优化,你看这个就足够了
查看>>
nginx启动脚本
查看>>
Nginx在Windows上和Linux上(Docker启动)分别配置基本身份认证示例
查看>>
Nginx在Windows下载安装启动与配置前后端请求代理
查看>>