为什么WA掉了两个点?实在没弄懂
查看原帖
为什么WA掉了两个点?实在没弄懂
322285
北京楼主2021/7/15 16:02

评测记录

代码:

//P1043 [NOIP2003 普及组] 数字游戏
//取余记得非负 
#include<bits/stdc++.h>
using namespace std;
const long long INF=0x7fffffffffffff;
long long a[100+10],w[100+10][100+10],dpmin[100+10][100+10][10+10],dpmax[100+10][100+10][10+10];
inline long long read()
{
	long long s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
	return s*w;
}
int main()
{
	int n=read(),m=read();
	for(int i=1;i<=n;++i)
		a[i]=read(),a[i+n]=a[i];
	
	for(int i=1;i<=2*n;++i)
		for(int j=i;j<=2*n&&j-i<n;++j)
			for(int k=1;k<=m;++k)
				dpmin[i][j][k]=INF,dpmax[i][j][k]=-INF;
	
	for(int i=1;i<=2*n;++i)
		w[i][i]=a[i],dpmin[i][i][1]=(a[i]%10+10)%10,dpmax[i][i][1]=(a[i]%10+10)%10;
	for(int i=1;i<=2*n;++i)
		for(int j=i+1;j<=2*n&&j-i<n;++j)
		{
			w[i][j]=w[i][j-1]+a[j],dpmin[i][j][1]=(w[i][j-1]+a[j])%10,dpmax[i][j][1]=(w[i][j-1]+a[j])%10;
			if(dpmin[i][j][1]<0)dpmin[i][j][1]=10+dpmin[i][j][1];
			if(dpmax[i][j][1]<0)dpmax[i][j][1]=10+dpmax[i][j][1]; 
		}
	
	for(int i=1;i<=2*n;++i)
		for(int j=i+1;j<=2*n&&j-i<n;++j)
			for(int k=2;k<=min(j-i+1,m);++k)
			{
				for(int l=i;l<j;++l)
				{
					for(int o=1;o<k&&l-i+1>=o;++o)
					{
						dpmin[i][j][k]=min(dpmin[i][j][k],dpmin[i][l][o]*dpmin[l+1][j][k-o]);
						//if(i==1&&j==4&&l==2)printf("%lld %lld %d\n",dpmin[i][l][o],dpmin[l+1][j][k-o],o);
						dpmax[i][j][k]=max(dpmax[i][j][k],dpmax[i][l][o]*dpmax[l+1][j][k-o]);
						//if(i==4&&j==7&&l==6)printf("%lld %lld %d\n",dpmin[i][l][o],dpmin[l+1][j][k-o],o);
					}
				}
			}
	long long ans_min=INF,ans_max=-INF;
	for(int i=1;i<=n+1;++i)
		ans_min=min(ans_min,dpmin[i][i+n-1][m]),ans_max=max(ans_max,dpmax[i][i+n-1][m]);
	printf("%lld\n%lld",ans_min,ans_max);
	return 0;
}

我试着把INF减掉几个f以后就过了???为什么呢。。。。。。

感谢大佬指教!

2021/7/15 16:02
加载中...