Летняя тренировка 1 Сессия 3

Насилие + Жадность + Симуляция + Минимальное связующее дерево

Т1

Jxq и ztz играют в настольный теннис Правила настольного тенниса следующие: в игре побеждает сторона, которая первой наберет 11 очков, а после 10 ничьих побеждает сторона, которая первой наберет 2 очка. Теперь представьте вам оценки двух человек в игре, оцените их результаты и выиграйте или проиграйте. Формат ввода: входные данные содержат несколько строк. Каждая строка содержит строку символов «jxq» или «ztz», что означает, что jxq получает одно очко или ztz получает одно очко; во второй строке содержится строка символов «jxq» или «ztz», что означает выигрыш. Одна сторона.

Смоделируйте, обратите внимание на детали. Есть две ситуации для победы. 1. Еще два гола необходимы для победы после 10 ничьих. 2. Первые 11 очков набираются, а другой игрок не набирает 10 очков.

#include<bits/stdc++.h>
using namespace std;
int tnum,onum;
string s;
int main()
{
    
    
    while(cin>>s)
    {
    
    
        if(s=="jxq")tnum++;
        else onum++;
        if((tnum==11&&onum<10)||(tnum>11&&tnum-onum>=2))//先到达11分||到达10平后多2分
        {
    
    
            cout<<onum<<":"<<tnum<<endl;
            cout<<"jxq";
            return 0;
        }
        if((onum==11&&tnum<10)||(onum>11&&onum-tnum>=2))
        {
    
    
            cout<<onum<<":"<<tnum<<endl;
            cout<<"ztz";
            return 0;
        }
    }
}


Т2

Средняя школа Туян уходит на летние каникулы! У Тока Лези новые планы на эти летние каникулы.Он осознал ценность жизни во время ограбления гробницы некоторое время назад и решил изменить практический способ заработка, то есть стать маленьким почтальоном!
Жареный Лези должен был доставить письмо по длинному переулку, направление которого нетрадиционно, и вы можете представить его как прямую линию. Чтобы каждый день рано утром больше спать, Рутс планирует арендовать место в этом переулке, чтобы он мог вставать как можно позже, закончив работу раньше указанного времени. На этом переулке слева направо n домов, расстояние между домом B и первым домом равно Di, так что Di отличается друг от друга, то есть никакие два дома не находятся в одном положении. Жареному Лези нужно выбрать один из этих n домов для проживания.
Каждое утро в каждый дом в этом переулке будет приходить письмо, и Росту нужно отправить письмо каждому из них. Кроме того, обратите внимание, что жареный лези довольно глупый. Он приносит с собой все письма из одного дома каждый раз, когда отправляет письмо. Если он хочет отправить его в другое место, ему нужно вернуться к себе домой и принести письмо, прежде чем отправлять его снова.
Жареный Лези уехал из своей резиденции и вернулся домой после доставки.
Как ваш маленький друг Роа Лези, скажите, пожалуйста, Роа Лези, как ему выбрать место жительства, чтобы сумма расстояний, которые ему нужно преодолевать каждое утро, чтобы отправить письмо, было наименьшей, и найдите эту минимальную сумму расстояний.

Выберите жадный, выберите среднее место в качестве отправной точки, расстояние и минимум. Затем используйте средний цикл, чтобы найти значения с обеих сторон.

#include<bits/stdc++.h>
using namespace std;
unsigned long long a[150000];
int n;
int main()
{
    
    
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    long long a1=0,a2=0;
    for(int i=1;i<=n/2;i++)a1+=a[n/2+1]-a[i];//到左边
    for(int i=n/2+2;i<=n;i++)a2+=a[i]-a[n/2+1];//到右边
    cout<<(a1+a2)*2;
    return 0;
}


T3

В фэнтезийном мире, где живет кошка Ава, есть несколько фантастических королевств, и в каждом фэнтезийном королевстве есть ровно два фэнтезийных города, все из которых только что построены. Так что дорога в нем не очень идеальна, изначально дороги не было.
Фэнтезийный мир разделен на северную и южную части длинной фэнтезийной рекой, в которой всего n фэнтезийных королевств. В каждом фэнтезийном королевстве есть города на севере и юге, но их взаимное расположение не может быть просто упорядочено. В частности, на севере фантастического мира есть n городов с запада на восток, которые принадлежат фантастическому королевству A1, A2 ... An. На юге фантастического мира есть n городов с запада на восток, которые принадлежат фантастическому королевству B1, B2 ... Bn. В соответствии с приведенными выше правилами ясно, что A и B оба являются перестановкой от 1 до n. Потому что номер каждого королевства будет и появится только один раз на севере и юге.
Взмахом руки Ака, правитель фантастического мира, построил дорогу между двумя городами в каждом фантастическом королевстве. Эти построенные дороги могут пересекаться, и это пересечение приведет к дружеским обменам между двумя королевствами. Если дороги двух королевств пересекаются, мы называем эти два королевства дружественными.
Теперь Ава хочет знать, сколько королевств она сможет найти, если захочет найти несколько королевств среди всех n фантастических королевств, чтобы все два из этих королевств были дружественными. То есть она хочет знать, когда набор королевств S удовлетворяет королевства, представленные любыми двумя дружественными элементами, каков максимальный размер набора S

Если вы хотите избежать пересечения, тогда абсцисса 1 и абсцисса 2 точки должны быть слева от нее, поэтому используйте массив, чтобы сохранить его в обратном направлении, а затем используйте массив, чтобы указать положение b в a, а затем перечислить Вы можете присоединиться, если место соответствует требованиям

#include<bits/stdc++.h>
using namespace std;
#define maxn 150000
int n,a[maxn],b[maxn],c[maxn],v[maxn],f[maxn];
int main() 
{
    
    
     
    cin>>n;
     
    for(int i=1;i<=n;i++)cin>>a[i],v[a[i]]=i;
    for(int i=1;i<=n;i++)cin>>b[n-i+1],c[n-i+1]=v[b[n-i+1]];//存入位置
     
    int len=1;
    f[1]=c[1];
    for(int i=2;i<=n;++i) 
    {
    
    
        if(c[i]>f[len])f[++len]=c[i];//加入
        else
        {
    
    
            for(int j=1;j<=len;j++)
            if(f[j]>c[i])
            {
    
    
                f[j]=c[i];
                break;
            }
        }
    }
    cout<<len;
    return 0;
}


T4

Жареный Лези устал от посыльного и решил снова разводить свиней.
Рулца отправили в деревню, специализирующуюся на разведении свиней, для обучения навыкам свиноводства. В настоящее время деревня совершенствует свои помещения. Транспортировка корма для свиней, которая первоначально осуществлялась вручную, теперь заменяется транспортировкой по трубопроводу, но стоимость строительства нового трубопровода относительно высока. Колебался.
Роа Лези - увлеченный и хороший мальчик, он пришел в дом старосты деревни, чтобы обсудить этот вопрос с старостой деревни.
Староста деревни сказал Росту Лези, что свинофермы в деревне могут построить несколько центров по производству кормов для свиней, но стоимость строительства каждого центра по производству кормов для свиней очень высока, и для каждого требуется P единиц золотых монет. Но в то же время некоторые трубопроводы могут быть построены между каждыми двумя свинофермами. Стоимость строительства каждого трубопровода может быть разной. Свиноводческая ферма должна иметь корма для свиней, поэтому, если это не центр производства кормов для свиней, По некоторым трубопроводам должна быть возможность добраться как минимум до одного центра по производству кормов для свиней.
Жареный Лези решил помочь старосте деревни рассчитать минимальное количество золотых монет.

Рассмотрите возможность строительства центра производства кормов для свиней в точке n + 1. Расстояние от каждой точки до центра производства кормов для свиней - это стоимость строительства. Это означает, что должен быть центр производства кормов для свиней. Если вы запустите минимальное остовное дерево, вы можете рассчитать Стоимость Unicom n + 1 балл

#include<bits/stdc++.h>
using namespace std;
int a[550][550],mins[550],vis[550];
int n,m;
int main()
{
    
    
    cin>>n>>m;
    memset(mins,0x7f,sizeof(mins));
     
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    cin>>a[i][j];
     
    for(int i=1;i<=n;i++)//建设n+1的点
    a[i][n+1]=a[n+1][i]=m;
  
    n++;
    mins[1]=0;
    for(int i=1;i<=n;i++)//prim跑最小生成树
    {
    
    
        int k=0;
        for(int j=1;j<=n;j++)
        if(vis[j]==0&&(mins[j]<mins[k]))k=j;
        vis[k]=1;
        for(int j=1;j<=n;j++)
        if(vis[j]==0&&(mins[j]>a[k][j]))
        mins[j]=a[k][j];
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    ans+=mins[i];
    cout<<ans;
    return 0;
 } 

рекомендация

отblog.csdn.net/yhhy666/article/details/108227987