A题:Dual Trigger
题意:一个01字符串,每次只能选择俩不相邻的0,把他俩变成1(初始情况都是0)
问你最后能不能把这个全0字符串,变成所要求的那样
思路:
首先分奇偶情况,试了几种情况发现,奇数个1是不可能的
而对于偶数,也就只有一种情况是不行的:只有两个1并且最大的连续值就是2。
实现:
先把奇数给排除了,然后统计1的个数,统计最大连续1有几个
当1的个数为2,且最大连续值为2 就是NO 否则输出YES
#include<bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;cin>>T;
while(T--)
{
int n;cin>>n;
string a;
cin>>a;
int j=0;
int red=0,ans=0,ma=0;
for(auto i:a)
{
if(i=='1')
{
ans++;//记录1的个数
red++;
ma=max(ma,red);//记录最大连续1的个数
}
else red=0;
}
if(ans%2==1)
{
cout<<"NO"<<endl;
continue;
}
if(ans==2&&ma==2)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
return 0;
}
B题:Battle Cows
**题意:一堆数字,从左到右,相邻依次比较,大的晋级,和下一个比较。
你的奶牛是第k个,问:你这个奶牛最多能赢多少次?
(你有一次和别人换地方的机会,也可以不换)
分析:
抓住导致情况不同的本质几点,比如本题就是“比他大的”、“前面的比他大的”(前面如果有比他大的,他只能是0)
然后大致分个类:(只能初步规划出两个类,第三个类是在进一步实践中发现的)
1、前面没有比他大的,
2、前面有好多个(先想你很容易就能想到的,再想你没太注意的(这个直接列举多猜猜就是))
3、因为你算前面有多个的时候,你是用t0-t1 但是如果前面只有一个,没有t1 你自然会想到卡在12中间
实现:
1、先存进入一个数组里,然后再循环把每个比他大的,的下标,都存进另外一个数组(你要的是前后关系,你不需要知道比他大多少)(我以为这个地方俩循环会超时呢....毕竟那么多次询问呢,看来是我想多了)
2、然后看吧,三种情况
a.前面没有比他大的—————直接把这个k移动到第一个位置
b.前面有好多个比他大的————max(和第一个交换,和第一个比他大的交换)
c.前面一个后面几个————max(和一个交换,和第一个比他大的交换(这个时候,是k到t0的距离,而上面是t0到t1的距离))
关于思维题:
方法才是最重要的,方法想的不够好,你无法清晰的透过方法看到结果,实现的时候就慢慢吞吞,出现问题不断调试,最后把好多STL技巧都搬上了还是没调出来,这时候应该跳出来,看看方法。
方法想的尽量完全和清晰(做不到特别完整没关系,在初步实践中改正即可)
脑子学会和手学会还是有很大差距的,脑子学会,输入分类理解一遍就好了。
手学会,别无他法,唯有重复以上,不断输入输出
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
#define int long long
void solve() {
int n,k;cin>>n>>k;//n个数字 第k个数字
vector<int> a(n+1),t;
for(int i=1;i<=n;i++) {
cin>>a[i];//存入a数组
}
for(int i=1;i<=n;i++) {
if(a[i]>a[k]) t.push_back(i);//大于第k的,就存进去(存的是下标)
}
if(t.empty()){
cout<<n-1<<"\n";//如果t为空,整个数组里没有比第k个大的
return;
}
if(t.size()==1){//如果只有一个比他大的
if(t[0]>k) cout<<t[0]-2<<"\n";
else{
cout<<max(t[0]-2,k-t[0]-1+(t[0]!=1))<<"\n";
}
return;
}
if(t[0]>k){//前面没有比他大的(那就把第k个移动到第一个)
cout<<t[0]-2<<"\n";
}else if(t[1]<k){//前面有好几个大的
cout<<max(t[0]-2,t[1]-t[0]-1+(t[0]!=1))<<"\n";
}else{//这是卡在第一个和第二个之间对吧?
cout<<max(t[0]-2,k-t[0]-1+(t[0]!=1))<<"\n";
}
}
signed main() {
std::ios::sync_with_stdio(false), std::cin.tie(nullptr);
int t = 1;std::cin >> t;
while (t--) solve();
return 0;
}
标签:25,4.6,前面,int,Global,cin,long,using,red
From: https://www.cnblogs.com/yzzyang/p/18119293