[noip]2014复赛提高组day1 生活大爆炸剪刀石头布

本蒟蒻自己想的方法,非常好,哈哈哈哈哈哈哈

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,na,nb,a[50000],b[50000],fl[20000][20000],qja[20000],qjb[20000];/*我就是在这个地方入坑,看了数据之后觉得开的小,后来我这个方法扩展了一下数组,导致了RE。*/
int p,q,ansa,ansb;
int main()
{
	freopen("rps.in","r",stdin);
	freopen("rps.out","w",stdout);
	cin>>n>>na>>nb;
	for(int i=1;i<=na;i++) cin>>a[i];
	for(int i=1;i<=nb;i++) cin>>b[i];
	for(int i=0;i<5;i++)
	 for(int j=0;j<5;j++)
	  if(i==j) fl[i][j]=9999;
	fl[0][2]=1;fl[0][3]=1;//谁强,谁爆炸一波
	fl[1][0]=1;fl[1][3]=1;
	fl[2][1]=1;fl[2][4]=1;
	fl[3][2]=1;fl[3][4]=1;
	fl[4][0]=1;fl[4][1]=1;
	for(int i=1;i<=na;i++)
	 for(int j=1;j<=nb;j++)
	 {
	   a[i+na*j]=a[i];//扩展数组a
	 }
	for(int i=1;i<=nb;i++)
	 for(int j=1;j<=na;j++)
	  {
	  	b[i+nb*j]=b[i];//扩展数组b
	  }
	for(int i=1;i<=na*nb;i++)//巧妙运用前缀和,啊哈哈哈哈
	 {
	 	if(fl[a[i]][b[i]]==1)
	 	 {qja[i]=qja[i-1]+1;qjb[i]=qjb[i-1];}
	 	if(fl[a[i]][b[i]]==0)
		 {qja[i]=qja[i-1];qjb[i]=qjb[i-1]+1;}
		if(fl[a[i]][b[i]]==9999)
		 {qja[i]=qja[i-1];qjb[i]=qjb[i-1];}  
	 }
	p=n/(na*nb);
	q=n%(na*nb);
	ansa=qja[na*nb]*p+qja[q];
	ansb=qjb[na*nb]*p+qjb[q];
	cout<<ansa<<" "<<ansb;
	fclose(stdin);fclose(stdout);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42198700/article/details/82949817
今日推荐