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(); }
Miemeng真的蒻