PKU1179多边形游戏

/*多边形游戏*/

#include<stdio.h>



void MinMax(int n,int i,int s,int j,__int64& minf,__int64& maxf,__int64 m[101][101][2],char b[101]);

__int64 PolyMax(int n,__int64 m[101][101][2],char b[101]);



int main(){

	

	int a[101];

	char b[101];

	

	int n;

	while(scanf("%d",&n)!=EOF){

		for(int i=1;i<=n;i++){

			getchar();

			scanf("%c",&b[i]);

			scanf("%d",&a[i]);

			

		}



		__int64 m[101][101][2]={0};

		for(int ii=1;ii<=n;ii++){

			m[ii][1][0]=m[ii][1][1]=a[ii];

		}

		__int64 sum=PolyMax(n,m,b);

		printf("%I64d\n",sum);

		for(int kk=0,jj=1;jj<=n;jj++){

			if(sum==m[jj][n][1]){

				if(kk!=0)

					putchar(' ');

				printf("%d",jj);

				kk=1;

			}

		}

		putchar('\n');



	}

	return 0;

}



__int64 PolyMax(int n,__int64 m[101][101][2],char b[101]){

	

	__int64 minf,maxf;

	for(int j=2;j<=n;j++){

		for(int  i=1;i<=n;i++){

			for(int k=1;k<j;k++){

				MinMax(n,i,k,j,minf,maxf,m,b);

				if(k==1){

					m[i][j][0]=minf;

					m[i][j][1]=maxf;

					continue;

				}

				if(m[i][j][0]>minf)m[i][j][0]=minf;

				if(m[i][j][1]<maxf)m[i][j][1]=maxf;

			}

		}

	}



	__int64 temp = m[1][n][1];

	for(int i=2;i<=n;i++){

		if(temp<m[i][n][1]){

			temp=m[i][n][1];

		}

	}

	return temp;



}



void MinMax(int n,int i,int s,int j,__int64& minf,__int64& maxf,__int64 m[101][101][2],char op[101]){

	

	minf = 0x7fffffff;

	maxf = -0x7fffffff;

	__int64 e[4];

	__int64 a=m[i][s][0],b=m[i][s][1],r=(i+s-1)%n+1;

	__int64 c=m[r][j-s][0],d=m[r][j-s][1];

	if(op[r] == 't'){

		minf=a+c;

		maxf=b+d;

	}

	else{

		e[0]=a*c;

		e[1]=a*d;

		e[2]=b*c;

		e[3]=b*d;

		minf=e[0];

		maxf=e[0];

		for(int r=1;r<4;r++){

			if(minf>e[r])

				minf=e[r];

			if(maxf<e[r])

				maxf=e[r];

		}

	}



}

你可能感兴趣的:(pku)