Educational Codeforces Round 141

A. Make it Beautiful

他想要变美 ,我们按照题目说的做就行,通过判断我们发现如果在sort一遍后

sort(a + 1 , a + 1 + n);
if(a[1] == a[n])
{
    cout << "NO" << "\n";
    return ;
}

其他的情况我们就可以用一大一小的方式插入,这样就可以满足整个序列可以为beautiful

ACcode

void solve()
{
    ios;//这个是一个宏定义,可以去掉没有影响
    int t;
    cin >> t;
    while(t -- )
    {
        
    
        cin >> n;
        for(int i = 1 ; i <= n ; i ++ )
        {
            cin >> a[i];
            
        }
        sort(a + 1 , a + 1 + n);
        if(a[n] == a[1])
        {
            cout << "NO" <<"\n";
            continue;
            
            
        }
        cout << "YES" << "\n";
        for(int i = 1 ; i <= n / 2 ; i ++ )
        {
            cout << a[i] << " " << a[n - i + 1] << " ";
            
        }
        if(n % 2 == 1)
        {
            cout << a[n / 2 + 1];
        }
        
        
        cout << "\n";
    }
}

B. Matrix of Differences

这个题目只要满足时蛇形矩阵就可以,而且构造方式很多,关键在于怎么输出,代码我就写一个我赛时写出来的

ACcode

void solve()
{
    ios;
    int t;
    cin >> t;
    while(t -- )
    {
        int n;
        cin >> n;
        int q = n * n;
        int w = 1;
        int flag = 1;
        for(int i = 1 ; i <= n ; i ++ )
        {
            if(i % 2 == 1)
            {
                for(int j = 1 ; j <= n ; j ++ )
                {
                    if(flag == 1)
                    {
                        a[i][j] = q;
                        q -- ;
                        flag = 0;
                    }
                    else
                    {
                        a[i][j] = w;
                        w ++ ;
                        
                        flag = 1;
                    }
                }
            }
            else
            {
                for(int j = n ; j >= 1 ; j -- )
                {
                    if(flag == 1)
                    {
                        a[i][j] = q;
                        q --;
                        flag = 0;
                    }
                    else
                    {
                        a[i][j] = w;
                        w ++ ;
                        flag = 1;
                        
                    }
                }
            }
        }
        for(int i = 1 ; i <= n ; i ++ )
        {
            for(int j = 1 ; j <= n ; j ++ )
            {
                cout << a[i][j] << " ";
            }
            cout << "\n";
            
        }
    }
}

C. Yet Another Tournament

这个题目其实是一个不是很难的题目,这个题目既可以贪心又可以二分,所以是一道完全可做题,只不过确实很困,然后打的又是小号所以就睡觉了

思路:

这个题目就可以先排序,维护一个前缀和就行,单独判断我们可以打败几个人

但是我们不想要并列,我们想要超越,所以没有必要去花时间和一些打不过的人打,我们可以花时间去超越他人

所以就会有以下代码

if(i < n && m >= s[i] + max(a[i + 1] - b[i] , (int)0))
{
    res = min(res , n - i);
}

ACcode

void solve()
{
    ios;
    int t;
    cin >> t;
        while(t -- )
    {
        int n , m;
        cin >> n >> m;
        for(int i = 1 ; i <= n ; i ++ )
        {
            cin >> a[i];
            b[i] = a[i];
            
        }
        sort(b + 1 , b + 1 + n);
        for(int i = 1 ; i <= n ; i ++ )
        {
            s[i] = s[i - 1] + b[i];
        }
        int res = n + 1; //有 n + 1 个人
        for(int i = 1 ; i <= n ; i ++ )
        {
            if(m >= s[i])
            {
                res = min(res , n - i + 1);
            }
            if(i < n && m >= s[i] + max(a[i + 1] - b[i] , (int)0))
            {
                res = min(res , n - i);
            }
        }
        cout << res << "\n";
    }
    
    
}    

 

posted @ 2023-01-09 08:33  AK梦  阅读(80)  评论(0)    收藏  举报