C++: Blue Bridge Cup-22 tarjetas-preguntas reales

C++: Blue Bridge Cup-22 tarjetas-preguntas reales

Simplemente registre y familiarícese con las ideas



tema

Hoy, Xiao Ming está clasificando sus cartas.

Tiene un total de n tipos de cartas, el i-ésimo tipo de carta está impreso con un número entero positivo i(i ∈ [1, n]), y actualmente hay ai cartas del i-ésimo tipo de carta.

Y si hay n cartas, una de cada tipo, entonces estas n cartas se pueden llamar un conjunto de cartas. Para hacer tantos mazos como fuera posible, Xiao Ming sacó m cartas en blanco, en las que podía escribir el número i, y usarlas como la i-ésima carta para hacer un mazo. Sin embargo, Xiao Ming sintió que las tarjetas escritas a mano no eran muy hermosas, por lo que decidió que, como máximo, las tarjetas i podrían ser tarjetas bi escritas a mano.

¿Puedo preguntar cuántos mazos puede hacer Xiao Ming como máximo?

1. Ideas

//Idea de dicotomía
1. Tome un valor intermedio como la mediana de a, mid
2. Variables all a[], sume todos los valores en a que sean menores que mid, sume la suma y juzgue si la suma es mayor que el número total de cartas vacías m,
y al mismo tiempo juzga si la carta que necesita ser complementada a mano es mayor que b[]
3. Use l y r para controlar el valor medio. Cuando a está en línea con el valor medio y sumado, muévase a la derecha, es decir, l=mid+1, cuando a no coincida Si el valor medio se suma a la condición, muévase a la izquierda r=mid-1, 4. Cuando a todos cumplan con la suma del valor
medio , es decir, ans = mid

Dos, el código

/*
22年蓝桥杯决B组赛真题-卡牌
//二分法思路
1.取一个中间值作为a的中位数,mid
2.变量所有a[],对a中小于mid的所有值都进行添加,sum累加,同时判断sum是否大于空牌总数m,
同时判断需要手写补的牌是否大于b[]
3.用l和r来控制mid值,当a中都符合mid值添加时,右移即l=mid+1;当a中有不符合mid值添加条件的,左移r=mid-1;
4.当a都符合mid值添加时,即ans = mid

*/

#include "iostream"
#include "vector"
#include "map"
#include "bits/stdc++.h" //包含了所有c++文件,刷题可用,做项目不用
using namespace std;

long long a[1000005], b[1000005];
// vector<int> a, b;

//判断a遍历mid是否符合条件
bool check(int mid, int n, int m)
{
    
    
    long long sum = 0;
    for (int i = 0; i < n; i++)
    {
    
    
        if (a[i] < mid)
        {
    
    
            if (mid - a[i] > b[i])
            {
    
    
                return false;
            }

            sum += mid - a[i];

            if (sum > m)
            {
    
    
                return false;
            }
        }
    }
    return true;
}

int main(int argc, const char **argv)
{
    
    

    long long n, m;
    cin >> n >> m;

    for (int i = 0; i < n; i++)
    {
    
    
        // int tempA;
        // cin >> tempA;
        // a.push_back(tempA);
        cin >> a[i];
    }
    for (int i = 0; i < n; i++)
    {
    
    
        // int tempB;
        // cin >> tempB;
        // b.push_back(tempB);
        cin >> b[i];
    }

    long long l = 0, r = n, ans = 0;
    while (l <= r)
    {
    
    
        long long mid = (l + r) / 2;
        if (check(mid, n, m))
        {
    
    
            l = mid + 1;
            ans = mid;
        }
        else
        {
    
    
            r = mid - 1;
        }
    }
    cout << ans << endl;

    return 0;
}

Resumir

Este código pasó 96 puntos. Debería ser que el problema long long length no tiene 100 puntos, pero no es seguro. La idea está básicamente dominada. Si usa vector, puede pasar 92 puntos. Consulte
https
:
// blog.csdn.net/m0_58177653/article/details/125345906 ?ops_request_misc=&request_id=&biz_id=102&utm_term=%E8%93%9D%E6%A1%A5%E6%9D%AF%E5%8D%A1%E7%89 %8C&utm_medium=distribute.pc_search_result.none-task-blog- 2 todos sobaiduweb~default-8-125345906.142 v73 wechat,201 v4 add_ask,239 v2 insert_chatgpt&spm=1018.2226.3001.4187#t3

Supongo que te gusta

Origin blog.csdn.net/Bellwen/article/details/129465477
Recomendado
Clasificación