来写一道*800的题,思路很简单,就是这道题我们应该怎么去严谨地思考
Problem - 1761A - Codeforces
思路:
结论题的分类讨论一定要不重不漏
一开始很容易想到,前缀和后缀不能有重合
那么有重合部分就判No
没有重合的情况:
隔1个,隔2个,隔3个....
如果只隔一个也判No,因为此时a和b应该等于n
如果a和b确实等于n,就判Yes
所以对于a=b=n的情况需要去特判
如果一个结论的前提是边界情况,那么我们要把这个边界情况拿去特判
如果隔2个及以上,考虑一般情况去证明
对于一般情况,都可以选两个边上的元素交换,使其满足条件
所以隔2个及以上,一定Yes
Code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,a,b;
void solve(){
cin>>n>>a>>b;
if(n==a&&a==b){
cout<<"Yes"<<'\n';
return;
}
int l=a,r=n-b+1;
if((r-1)-(l+1)+1>1) cout<<"Yes"<<'\n';
else cout<<"No"<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}
总结:
结论题的分类讨论一定要不重不漏
如果一个结论的前提是边界情况,那么我们要把这个边界情况拿去特判
证明有3种方法:一般情况去证明,反证,数学归纳