题解
为什么只有7.15的题解没有14号的呢..因为14号难得放天假啊..为什么要把这么美好的日子拿来做题呢!当然应该出去走走拍拍风景
和好看的小姐姐了。今天的题比较水,做的事14年的真题(当年好像一等线500?)首测275.比较一般。
第一题——生活大爆炸版石头剪刀布(rps)
【题目描述】
- 告诉你两个人在玩石头剪刀布,并引入了两种新的方式。然后给你张胜负表,告诉你赢得得一分,平局和输的不得分。每人出拳有一个固定周期,一共进行n轮。求最终两个人的得分。
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/6053c34010c85f0a34629b02097fd2d1.png)
- 表中的输入顺序分别用12345表示。
- 这个真的是水题。先根据两个人的出拳建立表(5X5),然后再线性模拟就好了。算法复杂度是 O(n) O ( n )
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
void fff(){
freopen("rps.in","r",stdin);
freopen("rps.out","w",stdout);
}
int mp[5][5]={
0,0,1,1,0,
1,0,0,1,0,
0,1,0,0,1,
0,0,1,0,1,
1,1,0,0,0
};
int n,na,nb,sa=0,sb=0;
int a[250],b[250];
int main(){
fff();
scanf("%d%d%d",&n,&na,&nb);
for (int i=1;i<=na;i++) scanf("%d",&a[i]);
for (int i=1;i<=nb;i++) scanf("%d",&b[i]);
int i=1,j=1;
while (n>0){
n--;
sa+=mp[a[i]][b[j]];
sb+=mp[b[j]][a[i]];
i++;
j++;
if(i==(na+1)) i=1;
if(j==(nb+1)) j=1;
}
cout<<sa<<' '<<sb;
return 0;
}
第二题——联合权值(link)
【题目描述】
- 给你一棵树,树上有点权,相邻点之间距离为1。求任意两点之间距离为2的乘积之和与乘积的最大值。
- 稍微有点难想。由于两点之间是相差为2的,则对于每一个点,在总的sum之间是增加所有孩子与父亲的乘积和所有孩子之间的乘积之和。最大值也可以找出第一大的孩子和第二大的孩子进行乘积维护。
- 那么这一点在dfs时就可以进行操作了。
- 而对于每两个孩子之间的乘积求和则可以利用数学上的多项和平方后展开求出。 (a+b+c)