2018/11/9 周五集训队第四次测试赛补题题解

感慨

总的来说这一次真的是螺旋升天,先做D题发现是个数学题半小时多没做出来又去做A,之后的B C都不会E最后也状态不好没有做出来。看这些题比赛的时候有点感觉怂的吓破胆不敢写都,实际上还是自己不自信造成的。比赛不可能都是一下子就能想出来的题,之前比赛可能过于容易搞得题一下子就能想出来,第一次做一下子想不出来的题的比赛有点不敢写还。。。

A 生活大爆炸版 石头剪刀布

解析

题目唯一的难度就是那个图实在是太沙雕了容易看错。具体做法就是写一个函数把每种情况所对应的结果算出来然后把两个数分别加起来就行了。注意周期性有%就可以了

我的代码

#include <bits/stdc++.h>
using namespace std;
int num1[1000],num2[1000];
int check(int a,int b)
{
	if(a==0)
	{
		if(b==0)
		return 0;
		if(b==1)
		return 0;
		if(b==2)
		return 1;
		if(b==3)
		return 1;
		if(b==4)
		return 0;
	}
	if(a==1)
	{
		if(b==0)
		return 1;
		if(b==1)
		return 0;
		if(b==2)
		return 0;
		if(b==3)
		return 1;
		if(b==4)
		return 0;
	}
	if(a==2)
	{
		if(b==0)
		return 0;
		if(b==1)
		return 1;
		if(b==2)
		return 0;
		if(b==3)
		return 0;
		if(b==4)
		return 1;
	}
	if(a==3)
	{
		if(b==0)
		return 0;
		if(b==1)
		return 0;
		if(b==2)
		return 1;
		if(b==3)
		return 0;
		if(b==4)
		return 1;
	}
	if(a==4)
	{
		if(b==0)
		return 1;
		if(b==1)
		return 1;
		if(b==2)
		return 0;
		if(b==3)
		return 0;
		if(b==4)
		return 0;
	}
}
int main()
{
	int n,na,nb,sum1=0,sum2=0;
	cin>>n>>na>>nb;
	for(int i=1;i<=na;i++)
	cin>>num1[i];
	for(int i=1;i<=nb;i++)
	cin>>num2[i];
	for(int i=1;i<=n;i++)
	{
    sum1+=check(num1[(i-1)%na+1],num2[(i-1)%nb+1]);
		sum2+=check(num2[(i-1)%nb+1],num1[(i-1)%na+1]);
    //cout<<num1[(i-1)%na+1]<<" "<<num2[(i-1)%nb+1]<<" "<<check(num1[(i-1)%na+1],num2[(i-1)%nb+1])<<" "<<check(num2[(i-1)%nb+1],num1[(i-1)%na+1])<<endl;
  }
	cout<<sum1<<" "<<sum2;
 }

B 联合权值

这个题试了试发现好像并不会。。。待研究

C 飞翔的小鸟

DP题,得等我DP再熟练熟练

D 质因数分解

解析

直接原地爆炸螺旋升天的题,半天做不出来打表机房电脑还死机真的无语。然后别人知道规律直接几行就完成了。。。洛谷这个题也是个入门难度的题,我想的太复杂了,实际上如果一个数由两个质因数相乘得到,那么他的因子肯定只有这两个质因数

我的代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    for(int i=2;i<=n;i++)
    if(n%i==0)
    return cout<<n/i,0;
}

E 寻宝

解析

比赛的时候也是前面搞得弄得看这题也有点怂了,加上本身题目就感觉很复杂,实际上题目并不难,直接模拟即可

我的代码(洛谷题解)

#include <bits/stdc++.h>
using namespace std;
int a[10010][105],b[10010][105],c[10010];
int main()
{
    ios::sync_with_stdio(0);//一定注意以后必须开头写这两行要不TLE教你做人
    cin.tie(0);cout.tie(0);
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
    {
        cin>>a[i][j]>>b[i][j];
        c[i]+=a[i][j];//c[i]用来记录一层的楼梯总数
    }
    int k,sum=0;
    cin>>k;
    for(int i=0;i<n;i++)
    {
        sum+=b[i][k]%20123;//按照题目要求进来就加上原来的房间号码
        int ans=0;
        int p=k;
        b[i][p]=(b[i][p]-1)%c[i]+1;//转化为最小周期内的数
        while(ans<b[i][p])
        {
            ans+=a[i][k];
            if(ans==b[i][p])//如果走完直接break
            break;
            k++;
            if(k==m)//顺便变化一下k
            k=0;
        }
    }
    cout<<sum%20123;//多余一次也不会出错!
}
原文地址:https://www.cnblogs.com/baccano-acmer/p/9943313.html