大致题意 : 给定二维字符数组, '*'代表图标, '.'代表空白, 按照电脑桌面默认的图标排序方式进行排序(即先排第一列, 再排第二列, 以此类推) , 每次操作可以任意互换两个数组元素位置, 给定q次查询, 每次查询为一个下标, 并会将该下标取反(图标变空白, 空白变图标), 问每次查询的最小操作次数

思路 : 将二维数组以列为一维进行二维转一维, 对一维字符串进行模拟分类讨论即可

代码及其注释 :

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <sstream>
#include <map>
#include <stack>
#include <set>
#include <queue>
#include <iomanip>
using namespace std;stringstream ss;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 1e3+10;
const int INF = 0x3f3f3f3f;int n,m,q;
char g[N][N], a[N*N];
int main()
{scanf("%d%d%d", &n, &m, &q);int cnt = 0;for(int i = 1; i<=n; i++){for(int j = 1; j<=m; j++){cin>>g[i][j];if(g[i][j] == '*') cnt ++;a[(j-1)*n+i] = g[i][j];}}int ans = 0;// 以列为维度转化为一维数组进行处理, ans为需要移动的图标for(int i = cnt+1; i<=n*m; i++) if(a[i] == '*') ans ++;while(q -- ){int x,y,cur;cin>>x>>y;// 位置转换为1维数组cur = (y-1)*n+x;// 若当前位置为图标, 则图标总数减小, 图标总数减少会导致图标排序后的最大值减少(即合法范围会变动)// 通过减少前的合法范围来进行判断极限位置处的变动,是否需要移动的图标(答案)会增加,判断后减少图标总数// 如 **.*...*. 若当前位置为倒数第二颗'*',初始ans为1(即当前这颗),// 当当前这颗'*'变为'.'后,ans--, 但'*'的总数cnt减少, cnt为3,// 导致原本合法的第四位置上(即原来合法范围的最大值)的'*'会不合法,ans++,if(a[cur] == '*'){a[cur] = '.';if(cur > cnt) ans --;if(cur != cnt && a[cnt] == '*') ans ++;cnt --;}else{// 若当前位置为空白, 则图标总数增加, 通过增加后的合法范围来判断极限位置处的变动, // 同理上一种情况, 不过这种判断需要先变动合法范围, // 因为合法范围增大影响的是增大后的最大位置, 合法范围减小影响减小前的最大位置a[cur] = '*';cnt++;if(cur > cnt) ans++;if(cur != cnt && a[cnt] == '*') ans --;}cout<<ans<<endl;}
}

CF1674 F. Desktop Rearrangement(二维转一维, 模拟)相关推荐

  1. CF1674 F.Desktop Rearrangement(模拟)

    传送门 这种小模拟题怎么能被评为 1800 的啊 题意 给定一个含有 0 0 0 和 1 1 1 的矩阵,需要将其中的 1 1 1 按电脑桌面进行排列(即每个 1 1 1 的左侧和上侧都为 1 1 1 ...

  2. Win10 UWP开发:摄像头扫描二维码/一维码功能

    这个示例演示整合了Aran和微软的示例,无需修改即可运行. 支持识别,二维码/一维码,需要在包清单管理器勾选摄像头权限. 首先右键项目引用,打开Nuget包管理器搜索安装:ZXing.Net.Mobi ...

  3. 一维二维_Excel教程:二维转一维,方法你绝对没用过

    提示:小程序可以高清看本公众号视频教程 苹果iOS用户请微信扫码学习 一.数据透视表的方法 操作步骤: 按键调出[数据透视表和数据透视图向导] 选中[多重合并计算数据区域],点[下一步] [创建单页字 ...

  4. 为某个酒店编写程序:酒店管理系统,模拟订房、退房、打印所有房间状态等功能。 1、该系统的用户是:酒店前台。 2、酒店使用一个二维数组来模拟。“Room[][] roo

    代码 房间类 package com.bjpowernode.javase.day23homework; //每一个房间Room应该有:房间编号.房间类型.房间是否空闲 public class Ro ...

  5. 非静压模型SWASH学习(6)——二维波浪变形模拟算例(Wave transformation over an elliptic shoal on a sloped bottom)

    二维波浪变形模拟算例(Wave transformation over an elliptic shoal on a sloped bottom) 算例简介 模型配置 网格及参数设置 网格与地形 初始 ...

  6. 期望dp ---- E. Vasya and Magic Matrix(二维转一维+前缀和优化的期望dp)

    题目链接 题目大意: 解题思路: 首先我们先把二维矩阵变成一维的(x,y)→(x−1)⋅m+y(x,y)\rightarrow(x-1)\cdot m+y(x,y)→(x−1)⋅m+y 然后对每个点按 ...

  7. cf 1674 F. Desktop Rearrangement

    题意解释:将图标按列排布,保证每个图标的上方和左方都有图标(就像电脑图标一样),并在询问的过程中改变图标,要求出最小合法步数 模拟写法:在读入和处理中维护四个变量:cnt,cou,a,b,分别表示*的 ...

  8. mysql二维转一维_二维数组转为一维数组

    1.很多时候会遇到二维数组,转为一维数组的时候会很苦恼,尤其是刚刚接触PHP的phper. 如下:将$arr转化为一维数组 $arr = Array ( Array ( 'uuid' => 'a ...

  9. java把二维转换为一维_在R语言中什么函数可以将二维数组转换成一维数组

    满意答案 vi31892i 2013.09.11 采纳率:44%    等级:11 已帮助:6956人 这好象是汇编语言的问题吧 举个例子吧 #include "iostream.h&quo ...

最新文章

  1. Price suggestion(EDA)下--nlp的处理
  2. C++类class和结构体struct区别
  3. Dubbo-go 源码笔记(一)Server 端开启服务过程
  4. hiveserver2和metastore简要概括作用
  5. 洛谷P1373 小a和uim之大逃离 动态规划
  6. Thread 线程同步、线程状态
  7. destoon不支持php7,Destoon 7.0常见问题解决方法
  8. 使用Microsoft Lookback网卡解决了断网情况下 Virtual Server 虚机和主机的网络连接
  9. pthread_detach()与pthread_join的区别?
  10. 80. Session
  11. UE4 Spline
  12. android 农历源码,android实现显示阳历和农历源码
  13. 微信小程序退款 报错 FAIL 证书验证失败
  14. 两步实现在C代码中快速集成gtest进行单元测试
  15. 医学图象存储、检索和显示的新技术及新动向
  16. 关于windows XP下北洋BTP-2200E打印设置问题
  17. 王者荣耀微信登录服务器无反应,王者荣耀微信登不上去怎么办?登陆失败解决方法...
  18. Linux网络配置(NAT)
  19. 排序算法(冒泡排序)
  20. 如何用UE4制作2D游戏文档(二)——资源篇

热门文章

  1. 性能指标理解-CPU load average
  2. Android课程表架构简要分析
  3. 放疗是用计算机勾画靶区吗,人工智能辅助 放疗靶区勾画又快又准
  4. CSS:仅对子盒子修饰样式,三种让其在父盒子中水平垂直居中的方法及其优缺点(父盒子宽高未知)
  5. Java jar 找不到主类,jar包找不到或无法加载主类
  6. opencv3安装(ubuntu18.04)
  7. 【Python实战】用Python制作动态微信二维码qrcode
  8. 新的开始,新的希望。
  9. 华为鸿蒙系统为什么还没有用出来,华为鸿蒙系统不为手机而来,为谁而来?
  10. linux系统开机grub命令修复方法,解析Linux系统下GRUB故障修复