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];
		}
	}

}
posted @ 2011-11-13 00:10  Acmen  阅读(211)  评论(0编辑  收藏  举报