暑期培训1期3

暴力+贪心+模拟+最小生成树

T1

jxq 和 ztz 打乒乓球,乒乓球的规则如下: 在一局比赛中,先得 11 分的一方为胜方,10 平后,先多得 2 分的一方为胜 方。 现在给你比赛中两个人的得分情况,请你判断他们的得分情况和输赢。 输入格式: 输入数据包含多行,每行一个字符串“jxq”或“ztz”,表示 jxq 得一分或 ztz 得一分; 第二行一个字符串“jxq”或“ztz”,表示赢的一方。

模拟,注意细节分两种情况获胜,1.达到10平之后要多两球才能赢.2.先得11分,另外一个人没有十分

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


T2

图漾中学放暑假啦!烤乐滋在这个暑假还有一些新的计划,他前一段时间在盗墓的过程中体会到了生命的可 贵,决定换一种踏踏实实的法子赚钱,那就是成为一个小邮递员!
烤乐滋被安排到了一条长长的巷子送信,这条巷子的走向非常规整,你可以把它看成一条直线。烤乐滋为了在 每天的清晨多睡上一会,准备在这条巷子上租一个住处,这样能使他在规定时间前完成工作的前提下,能起得尽量 晚。 这条小巷上从左到右有 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个点建设猪粮生产中心,每个点到猪粮生产中心的距离为建设的代价,这样满足了肯定有一个猪粮生产中心,如果跑一遍最小生成树,就可以算出联通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