暴力+贪心+模拟+最小生成树
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;
}