noip2020提高组试题_noip提高组

noip2020提高组试题_noip提高组2020.04.01【NOIP提高组】模拟B组【0.LeftOut】题解题目大意:FarmerJohn正在尝试给他的牛群拍照。根据以往的经验,他知道这一工作往往结果不怎么样。这一次,FarmerJohn购买了一台昂贵的无人机,想要拍一张航拍照。为了使照片尽可能好看,他想让他的奶牛们在拍照时都朝向同一个方向。奶牛们现在在一块有围栏的草地上排列成N×N(2≤N≤1000)的方阵,例如:R…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

2020.04.01【NOIP提高组】模拟B 组【0.Left Out】题解

题目大意:

Farmer John正在尝试给他的牛群拍照。根据以往的经验,他知道这一工作往往结果不怎么样。这一次,Farmer
John购买了一台昂贵的无人机,想要拍一张航拍照。为了使照片尽可能好看,他想让他的奶牛们在拍照时都朝向同一个方向。奶牛们现在在一块有围栏的草地上排列成N×N(2≤N≤1000)的方阵,例如:RLR
RRL LLR 这里,字符’R’表示一头朝右的奶牛,字符’L’表示一头朝左的奶牛。由于奶牛们都挤在一起,Farmer
John没办法走到某一头奶牛面前让她调转方向。他能做的只有对着某一行或某一列的奶牛喊叫让她们调转方向,使得被叫到的这一行或列内的所有L变为R,R变为L。Farmer
John可以对任意多的行或列发号施令,也可以对同一行或列多次发令。 就如同Farmer
John想象的,他发现他不可能让他的奶牛们都朝向同一个方向。他最多能做的是让所有奶牛中除了一头之外都朝向相同的方向。请找出这样的一头奶牛。
Input
输入的第一行包含N。以下N行描述了奶牛方阵的第1…N行,每行包含一个长度为NN的字符串。
Output
输出一头奶牛的行列坐标,满足这头奶牛被调转方向的话,Farmer John就可以使他的所有奶牛都朝向同一个方向。如果不存在这样的奶牛,输出-1。如果存在多头这样的奶牛,输出其中行坐标最小的,如果多头这样的奶牛具有相同的行坐标,输出其中列坐标最小的。
Sample Input
3
RLR
RRL
LLR
Sample Output
1 1
在这个例子中,位于第1行第1列(左上角)的奶牛是那头令人讨厌的奶牛,因为Farmer John可以喊叫第2行和第3列来让所有奶牛都面向左侧,只有这一头奶牛面向右侧。

解析:
一个01矩阵,每次翻转一行或一列,最后除了一个元素之外的其他元素完全一样,求这个元素。
乍一看似乎没什么思路。怎么下手呢?
首先我们注意到,0和1是对称的,也就是说因为不限次数,只需把每一行翻转一遍就可以把元素01互换。
于是我们先把第一行和第一列翻转成0。
方法:对于第一行中的1,翻转它所在的列;对于第一列中的1,翻转它所在的行。
于是我们得到了一个新矩阵:(以5*5为例)
在这里插入图片描述
于是我们发现:在不改变第一行和第一列的情况下,蓝色部分无法被改变(因为两次翻转同一行等于没有翻转)。
若有解,则解只有以下三种位置:(1,1)、第一行或第一列(除(1,1)外)、蓝色区域中
若答案在蓝色区域中,目标位置此时一定为1并且其他部分全部为0
若答案在(1,1),则蓝色区域一定此时全部为1(翻转第一行再翻转第一列后,图中只有(1,1)为0)
若答案在第一行或第一列(除(1,1))上,则目标位置所在列或行在蓝色区域中一定全部为1且蓝色区域其他部分全部为0(翻转该列或行后,图中只有目标位置为1)
若不符合这三种情况,则无解。

附上AC Pascal代码:

var
        n,i,j,ans:longint;
        ch:char;
        a:array[1..1000,1..1000] of longint;
begin
        assign(input,'leftout.in');reset(input);
        assign(output,'leftout.out');rewrite(output);
        readln(n);
        for i:=1 to n do
        begin
                for j:=1 to n do
                begin
                        read(ch);
                        if ch='R' then a[i][j]:=1;
                end;
                readln;
        end;
        for i:=1 to n do
        begin
                if a[i][1]=1 then
                for j:=1 to n do
                begin
                        a[i][j]:=(a[i][j]+1) mod 2;
                end;
        end;
        for j:=1 to n do
        begin
                if a[1][j]=1 then
                for i:=1 to n do
                begin
                        a[i][j]:=(a[i][j]+1) mod 2;
                end;
        end;
        for i:=1 to n do
        begin
                for j:=1 to n do
                begin
                        ans:=ans+a[i][j];
                end;
        end;
        if ans=(n-1)*(n-1) then
        begin
                write(1,' ',1);
                exit;
        end
        else if ans=1 then
        begin
                for i:=1 to n do
                begin
                        for j:=1 to n do
                        begin
                                if a[i][j]=1 then
                                begin
                                        write(i,' ',j);
                                        exit;
                                end;
                        end;
                end;
        end
        else if ans=n-1 then
        begin
                for i:=1 to n do
                begin
                        ans:=0;
                        for j:=1 to n do
                        begin
                                ans:=ans+a[i][j];
                        end;
                        if ans=n-1 then
                        begin
                                write(i,' ',1);
                                exit;
                        end;
                end;
        end
        else
        begin
                for j:=1 to n do
                begin
                        ans:=0;
                        for i:=1 to n do
                        begin
                                ans:=ans+a[i][j];
                        end;
                        if ans=n-1 then
                        begin
                                write(1,' ',j);
                                exit;
                        end;
                end;
        end;
        write(-1);
        close(input);
        close(output);
end.

Jetbrains全家桶1年46,售后保障稳定

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200825.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 随机梯度下降法和批量梯度下降法_梯度下降法优化

    随机梯度下降法和批量梯度下降法_梯度下降法优化深度学习最常用的优化方法就是随机梯度下降法,但是随机梯度下降法在某些情况下会失效,这是为什么呢?带着这个问题我们接着往下看。一个经典的例子就是假设你现在在山上,为了以最快的速度下山,且视线良好,你可以看清自己的位置以及所处位置的坡度,那么沿着坡向下走,最终你会走到山底。∑i=1n∇θf(θ;xi,yi)+∇θϕ(θ)\sum_{i=1}^{n}\nabla_{\theta}f\left(\theta;x_{i},y_{i}\right)+\nabla_{\theta}\phi(\theta

    2022年9月10日
    0
  • AWE2017今日召开 智能家居发展势头强劲

    AWE2017今日召开 智能家居发展势头强劲

    2022年3月4日
    36
  • API Explorer 公测发布

    API Explorer 公测发布

    2021年6月13日
    152
  • python安装步骤(pycharm运行python)

    文章目录一。pycharm下载安装二。python下载安装三.pycharm上配置python一。pycharm下载安装pycharm下载地址:http://www.jetbrains.com/pycharm/download/#section=windows下载详细步骤:1-2-3-4-5-67-8-直接finish二。python下载安装9-python官网:https://www.python.org/进去网址后点击:1011-下载好后12

    2022年4月10日
    155
  • RDD:创建的几种方式(scala和java)[通俗易懂]

    RDD:创建的几种方式(scala和java)[通俗易懂]Spark编程每一个spark应用程序都包含一个驱动程序(driverprogram),他会运行用户的main函数,并在集群上执行各种并行操作(paralleloperations)spark提供的最主要的抽象概念有两种: 弹性分布式数据集(resilientdistributeddataset)简称RDD ,他是一个元素集合,被分区地分布到集群的不同节点上,可以被并行操作,RD…

    2022年6月10日
    30
  • java 哈希冲突

    java 哈希冲突问题一:什么是哈希冲突通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致经过哈希函数处理后仍然有不同的数据对应相同的哈希值。这时候就产生了哈希冲突。问题二:怎么解决哈希冲突开放地址法;再哈希法;链地址法(拉链法);公共溢出区法。开放地址法:开放地址法处理冲突的基本原则就是出现冲突后按照一定算法查找一个空位置存放…

    2022年6月16日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号