主页
搜索
最近更新
数据统计
申请密钥
系统公告
1
/
1
请查看完所有公告
呜呜呜赛时只打了91分 笑 传 之 P5427
最后更新于 2025-07-31 09:56:53
作者
kuuu
分类
个人记录
复制 Markdown
查看原文
删除文章
更新内容
### 今天!! **某个人给我比了个赛((** 这是赛时第3[题](https://www.luogu.com.cn/problem/P5427),也是我想出来的唯一一个思维题。。。 当时只有一个点$哇$了,原来有一个情况没考虑到。。。。。解决之后就过了 ↓ 给你们分享一下我的英雄事迹(? 我发现了,假如有一个字符串作为《标准》,这时如果所有的字符串都等于标准,或者跟标准反着来,就可以通过行列反转来达成统一,如果不符合标准也不是反着的标准,就是我们要找的 **讨 厌 的 奶 牛** 所在的位置。 我知道你们不懂,但你们先别不懂: ``` R L L L R R R L L ``` 像这种,如果标准是 `R L L` ,第二行的 `L R R` 每个字符都跟标准相反,介就是反着的标准。 此时反转第一列 再反转第二行,就能达成统一。 再看个反例: ``` R R L L R R R L L ``` 此时如果标准是 `R L L` ,第一行既不是正着的标准 `R L L` ,也不是反着的标准 `L R R` ,现在反转第一列 再反转第二行,就会得到: ``` L R L L L L L L L ``` 显然 $1,2$ 就是辣个讨厌的奶牛。 我知道你们还是不懂,我当时也不知道怎么证明(反正发现了这个规律 ```cpp #include<bits/stdc++.h> using namespace std; int n=0; string a[1010]={""}; string tmp="";//储存标准串的 int main() { cin>>n; cin>>a[0]; for(int i=1;i<n;i++) { cin>>a[i]; if(a[i]==a[i-1])tmp=a[i];//一样的话就假定它是标准 else//要么就是反着的,也把它定为标准 { int f=0; for(int j=0;j<n;j++) { if(a[i][j]==a[i-1][j])//既不是正着的也不是反着的 { f=1;break; } } if(!f)tmp=a[i];//是反着的,定为标准 } } int ans=0,pos1=-1,pos2=-1;//ans:判断同一方案有多个讨厌的奶牛 for(int i=0;i<n;i++) { if(a[i]!=tmp)//不符合正着的标准 { int t0pos=0,t1pos=0,t0=0,t1=0; for(int j=0;j<n;j++) { if(a[i][j]==tmp[j])//也不是反着的标准 { if(!t1)t1pos=j; t1++; }//分别计算跟正标准相同和不同的字符数 else { if(!t0)t0pos=j; t0++; } } if(t1==1&&!ans)//只有一个跟正标准相同,说明整体是反标准,只有这个不对 { pos1=i+1;pos2=t1pos+1;ans++;//有一个不符合要求的了 } else if(t0==1&&!ans)//说明整体是正标准,只有一个不对 { pos1=i+1;pos2=t0pos+1;ans++;//跟上面一样 } else if(t1!=0&&t0!=0&&!ans)//参差不齐,无法确定是正标准还是反标准 { pos1=i+1;pos2=min(t1pos,t0pos)+1;ans++;//此时就要取坐标最小的那个不对的 } else if(!(t1==0||t0==0)&&ans)//如果这个不符合要求,但是前面已经有不符合要求了,说明有同时出现多个不对的,无解(当时我就是没考虑到这个www { cout<<-1;return 0; } } } if(pos1!=-1&&pos2!=-1)cout<<pos1<<" "<<pos2;//有解的话按要求输出 else cout<<-1;//没有不符合要求的 return 0; } ``````
正在渲染内容...
点赞
0
收藏
0