洛谷评测姬速度
查看原帖
洛谷评测姬速度
227824
JK_LOVER楼主2020/8/30 18:23
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int read(){
	int x=0,f=0;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar();}
	while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
	return f?-x:x;

}
int a[N],dp[7100000],res[7100000],n,Max;
int mod = 1e9+7;
//bitset<1400000> f;
int main()
{
	n = read();dp[0] = 1;
	for(int i = 1;i <= n;i++) {
		a[i] = read();
		for(int j = Max;j >= 0;j--) dp[j+a[i]] = (1LL * dp[j+a[i]] + dp[j] + mod)%mod;
		Max += a[i];
	}
	int ans = 0,pos = 0;
	for(int i = 1;i <= n;i++) {
		int sum = 0;
		for(int j = 0;j <= Max;j++)
		{
			res[j] = dp[j];
			if(j >= a[i]) res[j] = (1LL * res[j] - res[j-a[i]] + mod) % mod;
			if(res[j]) sum++;
		}
		if(sum > ans || (sum == ans && a[i] < a[pos])){
			ans = sum;pos = i;
		}
	}
	for(int i = a[pos];i <= Max;i++) {
		dp[i] = (1LL * dp[i] - dp[i - a[pos]] + mod) % mod;
	}
	for(int i = 1;i <= n;i++) {
		if(i == pos) continue;
		for(int j = 0;j <= Max-a[i];j++) dp[j] = (1LL * dp[j] + dp[j + a[i]] + mod) % mod;
	}
	for(int i = 1;i <= Max+1;i++){
		if(!dp[i]) {
			printf("%d %d\n",a[pos],i);
			break;
		}
	}
	return 0;
//	f[7000*n] = 1;
//	for(int i = 1;i <= n;i++) {
//		if(i != pos) f = f|(f<<a[i])|(f>>a[i]);
//	}
//	for(int i = 1;i <= Max+1;i++){
//		if(!f[i+7000*n]) {
//			printf("%d %d\n",a[pos],i);
//			return 0;
//		}
//	}
	return 0;
}

这个 O(n2m)O(n^2m) 的代码被卡成 6060 分,换了 bitset\text{bitset} 一样。 (LOJ能过)

2020/8/30 18:23
加载中...