4.6Codeforces Global Round 25

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;
}

posted @ 2024-04-07 16:12  涤生yang  阅读(37)  评论(0)    收藏  举报