19-10-26-F

ZJ一下:

T1码了暴力但是并没有开出来身高的神奇性质……

T2打模拟,但是只摸了卅分

T3不会,码了一个测试点分治。10分

TJ一下:

T1。

发现身高范围在$[140,200]$时,直接去重跑$\text{dp}$就行了。

时间复杂度:$\Theta(V^2)$($V$为值域大小)

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define N 111111
#define K 22
#define LF double

using namespace std;

int pn,qn;
LF arr[N],ans;
LF dp[N][K];
inline LF p2(LF k){
	return k*k;
}
int main(){
//	freopen("queue.in" ,"r",stdin);\
	freopen("queue.out","w",stdout);
	scanf("%d%d",&pn,&qn);
	for(int i=1;i<=pn;i++)
		scanf("%lf",arr+i);
	sort(arr+1,arr+pn+1);
	pn=unique(arr+1,arr+pn+1)-arr-1;
	for(int i=1;i<=pn;i++)
		for(int j=1;j<=qn;j++)
			dp[i][j]=1e10;
	for(int i=1;i<=pn;i++){
		dp[i][1]=p2(arr[i]-arr[1]);
	}
	for(int i=2;i<=pn;i++){
		for(int j=2;j<=qn;j++){
			for(int k=i-1;k>=1;k--){
				dp[i][j]=min(dp[i][j],dp[k][j-1]+p2(arr[i]-arr[k+1]));
			}
		}
	}
	ans=1e10;
	for(int i=1;i<=qn;i++)
		ans=min(ans,dp[pn][i]);
	printf("%.2lf\n",ans);
}

/*
140.59 168 170 180 199.99
*/

T2

模拟(竟然没改出来,遗憾死了……)

所以:

$$\Huge \sqcup$$

T3

采用法2。

类似抵制克苏恩?

设$f_{i,j,k,x}$为有$i$种球只剩一个,$j$种球只剩两个,$k$个球只剩三个,上次拿的球有$x$个(拿之前)

于是用记忆搜,转移并不费力。

因为没取模,于是码一个高精度。

不要用 __int128_t ! 不要用 __int128_t ! 不要用 __int128_t !

 

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define L 55
#define N 16

using namespace std;

struct Hyper_long{
	int A[L];
	Hyper_long(){memset(A,0,sizeof A);A[0]=1;}
	int length(){return A[0];}
	void set_l(int len){this->A[0]=len;}
	int &operator [](int id){
		return A[id];
	}
	friend Hyper_long operator + (Hyper_long &a,Hyper_long &b){
		Hyper_long c;
		int len=max(a.length(),b.length()),r=0;
		for(int i=1;i<=len;i++){
			c[i]=a[i]+b[i]+r;//cout<<c[i]<<endl;
			r=c[i]/10000;//cout<<r<<endl;
			c[i]%=10000;//cout<<c[i]<<endl;
		}
		if(r){
			len++;
			c[len]=r;
		}
		c.set_l(len);
		return c;
	}
	void out(){
		printf("%d",A[A[0]]);;
		for(int i=A[0]-1;i>0;i--)
			printf("%04d",A[i]);
		puts("");
	}
}dp[N][N][N][N],_1;
bool m[N][N][N][N];
int cn,bn[N],pos[N];
Hyper_long operator * (Hyper_long a,int b){
	Hyper_long c;
	int len=a.length();
	long long r=0;
	for(int i=1;i<=len;i++){
		c[i]=a[i]*b+r;
		r=c[i]/10000;
		c[i]%=10000;
	}
	while(r){
		len++;
		c[len]=r%10000;
		r=c[len]/10000;
	}
	c.set_l(len);
	return c;
}
void operator += (Hyper_long &a,Hyper_long b){a=a+b;}
Hyper_long dfs(int i,int j,int k,int las){
	if((!i)&&(!j)&&(!k))return _1;
	if(m[i][j][k][las])return dp[i][j][k][las];
	Hyper_long ans;
	if(i) ans+=dfs(i-1,j  ,k  ,1)*(i-(las==2));
	if(j) ans+=dfs(i+1,j-1,k  ,2)*(j-(las==3));
	if(k) ans+=dfs(i  ,j+1,k-1,3)*(k-(las==4));
	m[i][j][k][las]=1;
	return dp[i][j][k][las]=ans;
}
int main(){
	cin.sync_with_stdio(false);
	_1[0]=_1[1]=1;
	cin>>cn;
	for(int i=1;i<=cn;i++){
		cin>>bn[i];
		pos[bn[i]]++;
	}
	dfs(pos[1],pos[2],pos[3],6).out();
}
posted @ 2019-10-26 16:30  Miemeng_麦蒙  阅读(98)  评论(0编辑  收藏  举报

小麦在雨中,蒙蒙的雾气

麦蒙不想有人骚扰他,如果有必要 联系 QQ:1755601414

如果你嫌广告大,那就喷我吧,不是博客园的锅。