codeforces 1607D.Blue-Red Permutation

该博客讨论了如何解决Codeforces上的问题1607D,即给定一个蓝红涂色的数组,通过蓝色元素减1或红色元素加1的操作,判断能否将数组变为1到n的排列。博主提出了一个贪心策略,首先从前向后检查,再从后向前检查,以确定能否达到目标。然而,最初的尝试未能通过所有测试用例。接着,博主提出使用结构体或对字符和数字进行排序的方法来判断是否存在可行的转换路径。

D. Blue-Red Permutation

You are given an array of integers a of length n. The elements of the
array can be either different or the same.

Each element of the array is colored either blue or red. There are no
unpainted elements in the array. One of the two operations described
below can be applied to an array in a single step:

either you can select any blue element and decrease its value by 1; or
you can select any red element and increase its value by 1. Situations
in which there are no elements of some color at all are also possible.
For example, if the whole array is colored blue or red, one of the
operations becomes unavailable.

Determine whether it is possible to make 0 or more steps such that the
resulting array is a permutation of numbers from 1 to n?

In other words, check whether there exists a sequence of steps
(possibly empty) such that after applying it, the array a contains in
some order all numbers from 1 to n (inclusive), each exactly once.

Input The first line contains an integer t (1≤t≤104) — the number of
input data sets in the test.

The description of each set of input data consists of three lines. The
first line contains an integer n (1≤n≤2⋅105) — the length of the
original array a. The second line contains n integers a1, a2, …, an
(−109≤ai≤109) — the array elements themselves.

The third line has length n and consists exclusively of the letters
‘B’ and/or ‘R’: ith character is ‘B’ if ai is colored blue, and is ‘R’
if colored red.

It is guaranteed that the sum of n over all input sets does not exceed
2⋅105.

Output Print t lines, each of which contains the answer to the
corresponding test case of the input. Print YES as an answer if the
corresponding array can be transformed into a permutation, and NO
otherwise.

You can print the answer in any case (for example, the strings yEs,
yes, Yes, and YES will be recognized as a positive answer).

题意:给你n个数和n个r或b,b表示当前位置的数能够-1,r表示当前位置数能够+1,能多次使用当前位置的-1+1,求能不能得到一个1-n的任意一种排列

个人思路:贪心,绝对是贪心!当时就觉得从前往后遍历一遍看看缺的那个位置前面是否有能够来这里的,且移动的位置有多个数,然后在从后往前遍历一遍相同方式看有没有能够向下得到的,最后在判断每个数里面是不是有数,然后wa了

思路:利用结构体或者pair 存入字符和数字,然后对字符进行排序,没错是先对字符排序,然后查看当前位置的数字是否与当前坐标不匹配,偌不匹配则判断用字符能不能得到,不能则表示整个数组都没办法形成1-n。

代码:

#include <bits/stdc++.h>

using namespace std;
const int N = 2e5+10;
pair<char,int>s[N];


int main()
{
    int T;cin>>T;
    while(T--)
    {
        int n;cin>>n;
        for(int i=1;i<=n;i++)cin>>s[i].second;
        for(int i=1;i<=n;i++)cin>>s[i].first;

        sort(s+1,s+n+1);

//        for(int i=1;i<=n;i++)cout<<s[i].first<<" "<<s[i].second<<endl;
        int flag=0;
        for(int i=1;i<=n;i++)
        {
            if(s[i].second>i&&s[i].first=='R'||s[i].second<i&&s[i].first=='B')
            {
                flag=1;
                break;
            }
        }

        if(flag)puts("NO");
        else puts("YES");
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值