运行时错误求助!!!
查看原帖
运行时错误求助!!!
745365
Solitairs楼主2022/12/17 22:25

question:本人程序在本地测试时毫无问题,且第一个测试点(即样例)本地通过,但放到洛谷上时4个RuntimeError(RE)和一个WrongAnswer(WA)

下面附上代码
#include<bits/stdc++.h>
using namespace std;
long long n,m,dp[50],le=99999999999,ma=-9999999999;
//dp存储一圈数字
//le存储最小值,ma存储最大值
int compare(const void *a, const void *b)
{
    long long *pa = (long long*)a;
    long long *pb = (long long*)b;
    return (*pa )- (*pb);  //从小到大排序
}//排序比较函数

//区间dp
void dd(long long high,long long lis[]){//递归函数
//high是切分点个数,即lis元素个数
//lis和list是存储切分点的列表
	long long list[high];//由于递归时传参的是指针,会影响上层递归数组内容,所以需要再建一个临时数组来传参,并且递归后赋值lis回到原本状态
	for(long long i=0;i<high+1;i++){
		list[i]=lis[i];
	}//赋值
	long long now=high+1;
    //now是当前处理切分点个数
	bool isre=false;//检测是否重复,即是否需要跳过这个切分点
	if(now>m-1){
		qsort(list,m,sizeof(long long),compare);//从小到大排序
		long long res,ret=1,a,b;
        //res存储每个区间和
        //ret存储乘积
        //a为头,b为尾,用来计算区间和
		for(long long i=0;i<m;i++){
        //计算以每一个切分点为开头的值
			res=0;
			a=list[i];
			b=list[(1+i)%m];
			if(b<a)b=n+b;
        //如果尾巴小于头,即连接圈中的一部分
			do{
				a++;
				res+=dp[a%n];
			}while(a<b);
			ret*=(res%10+10)%10;//题目要求的取余方式
		}
		ma=max(ma,ret);
		le=min(le,ret);
		return;
	}
	for(long long i=0;i<n;i++){
    //遍历每一个个能的切分点
		for(long long si=0;si<high+1;si++){
			list[si]=lis[si];
		}//复原list原本状态
		list[now]=i;
		isre=false;
		for(long long ii=0;ii<now;ii++){
			if(i==list[ii]){//检测是否与前面的切分点重合
				isre=true;
				break;
			}
		}
		if(isre)continue;//如果重合切分点就跳过该种可能
		dd(now,list);//递归
	}
}
int main(){
	cin>>n>>m;
	for(long long i=0;i<n;i++){
		cin>>dp[i]; 
	}//输入
	long long list[]={0};
	for(long long i=0;i<n;i++){
    遍历每一种切分点
		list[0]=i;
		dd(0,list);
	}
    
	cout<<le<<endl<<ma;
	return 0;
} 

本人贴上的是做题时的代码,变量命名不规范处还请见谅,同时注释名词用的不对的地方欢迎指出

2022/12/17 22:25
加载中...