LOJ2557. 「CTSC2018」组合数问题

这道题是我第一道自己做完的题答题。考场上面我只拿了41分,完全没有经验。现在才发现其实掌握了大概的思路还是不难。

首先模拟退火,通过了1,2,6,9,10五个测试点。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define REP(i,st,ed) for(register int i=st,i##end=ed;i<=i##end;++i)
  4. #define DREP(i,st,ed) for(register int i=st,i##end=ed;i>=i##end;--i)
  5. typedef long long ll;
  6. template<typename T>inline bool chkmin(T &x,T y){return (y<x)?(x=y,1):0;}
  7. template<typename T>inline bool chkmax(T &x,T y){return (y>x)?(x=y,1):0;}
  8. inline int read(){
  9. int x;
  10. char c;
  11. int f=1;
  12. while((c=getchar())!='-' && (c>'9' || c<'0'));
  13. if(c=='-') f=-1,c=getchar();
  14. x=c^'0';
  15. while((c=getchar())>='0' && c<='9') x=(x<<1)+(x<<3)+(c^'0');
  16. return x*f;
  17. }
  18. inline ll readll(){
  19. ll x;
  20. char c;
  21. int f=1;
  22. while((c=getchar())!='-' && (c>'9' || c<'0'));
  23. if(c=='-') f=-1,c=getchar();
  24. x=c^'0';
  25. while((c=getchar())>='0' && c<='9') x=(x<<1ll)+(x<<3ll)+(c^'0');
  26. return x*f;
  27. }
  28. const int maxn=100000+10;
  29. const double delt=0.98;
  30. int a[maxn],n,m,k;
  31. int Wanted;
  32. inline double Possible(){ return rand()*1.0/RAND_MAX; }
  33. inline int getans(){
  34. freopen("placement8.out","w",stdout);
  35. REP(i,1,n) printf("%d%c",a[i],i==iend?'\n':' ');
  36. fclose(stdout);
  37. system("./simulator placement8.in placement8.out");
  38. freopen("res.txt","r",stdin);
  39. int res=read();
  40. fclose(stdin);
  41. if(res<=Wanted) exit(0);
  42. return res;
  43. }
  44. int main(){
  45. srand(time(0));
  46. freopen("placement8.ans","r",stdin);
  47. REP(i,1,10) Wanted=read();
  48. fclose(stdin);
  49. freopen("placement8.in","r",stdin);
  50. n=read(),m=read(),k=read();
  51. m=k;
  52. fclose(stdin);
  53. int Now;
  54. //cerr << Possible() << endl; return 0;
  55. REP(i,1,n) a[i]=rand()%m+1;
  56. while(1){
  57. double T=100;
  58. Now=getans();
  59. while(T>=1e-6){
  60. int x=rand()%n+1,y=rand()%m+1,z=a[x];
  61. a[x]=y;
  62. int res=getans();
  63. if(res<Now||(Possible()<exp((-fabs(res-Now))/T))) Now=res;
  64. else a[x] = z;
  65. T*=delt;
  66. }
  67. REP(i,1,1e5) {
  68. int x=rand()%n+1,y=rand()%m+1,z=a[x];
  69. a[x]=y;
  70. int res=getans();
  71. if(res<Now) Now=res; else a[x]=z;
  72. }
  73. }
  74. return 0;
  75. }

观察第三个测试点,发现只有三台TPU,且依赖数为0,最后答案为106,可以直接dp求出最优解。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define REP(i,st,ed) for(register int i=st,i##end=ed;i<=i##end;++i)
  4. #define DREP(i,st,ed) for(register int i=st,i##end=ed;i>=i##end;--i)
  5. typedef long long ll;
  6. template<typename T>inline bool chkmin(T &x,T y){return (y<x)?(x=y,1):0;}
  7. template<typename T>inline bool chkmax(T &x,T y){return (y>x)?(x=y,1):0;}
  8. inline int read(){
  9. int x;
  10. char c;
  11. int f=1;
  12. while((c=getchar())!='-' && (c>'9' || c<'0'));
  13. if(c=='-') f=-1,c=getchar();
  14. x=c^'0';
  15. while((c=getchar())>='0' && c<='9') x=(x<<1)+(x<<3)+(c^'0');
  16. return x*f;
  17. }
  18. inline ll readll(){
  19. ll x;
  20. char c;
  21. int f=1;
  22. while((c=getchar())!='-' && (c>'9' || c<'0'));
  23. if(c=='-') f=-1,c=getchar();
  24. x=c^'0';
  25. while((c=getchar())>='0' && c<='9') x=(x<<1ll)+(x<<3ll)+(c^'0');
  26. return x*f;
  27. }
  28. const int maxn=100+10,inf=0x3f3f3f3f;
  29. int dp[maxn][maxn][maxn],pre[maxn][maxn][maxn];
  30. int t[maxn][maxn];
  31. void dfs(int n,int i,int j){
  32. if(!n) return;
  33. if(pre[n][i][j]==1) dfs(n-1,i-t[n][1],j);
  34. else if(pre[n][i][j]==2) dfs(n-1,i,j-t[n][2]);
  35. else dfs(n-1,i,j);
  36. printf("%d ",pre[n][i][j]);
  37. }
  38. int main(){
  39. #ifndef ONLINE_JUDGE
  40. freopen("placement3.in","r",stdin);
  41. freopen("placement3.out","w",stdout);
  42. #endif
  43. int n=read(),m=read();
  44. m=read(),read();
  45. REP(i,1,n) REP(j,1,m) t[i][j]=read();
  46. m=106;
  47. memset(dp,inf,sizeof(dp));
  48. dp[0][0][0]=0;
  49. REP(i,1,n)
  50. REP(A,0,m) REP(B,0,m) REP(C,0,m) if(dp[i-1][A][B]!=inf){
  51. if(A+t[i][1]<=m)
  52. if(chkmin(dp[i][A+t[i][1]][B],dp[i-1][A][B])) pre[i][A+t[i][1]][B]=1;
  53. if(B+t[i][2]<=m)
  54. if(chkmin(dp[i][A][B+t[i][2]],dp[i-1][A][B])) pre[i][A][B+t[i][2]]=2;
  55. if(chkmin(dp[i][A][B],dp[i-1][A][B]+t[i][3])) pre[i][A][B]=3;
  56. }
  57. REP(i,0,m) REP(j,0,m) if(dp[n][i][j]<=m){
  58. dfs(n,i,j);
  59. return 0;
  60. }
  61. return 0;
  62. }

观察第四个测试点,发现依赖条件构成了三条链,则我们可以对每条链dp出最优值即可。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define REP(i,st,ed) for(register int i=st,i##end=ed;i<=i##end;++i)
  4. #define DREP(i,st,ed) for(register int i=st,i##end=ed;i>=i##end;--i)
  5. typedef long long ll;
  6. template<typename T>inline bool chkmin(T &x,T y){return (y<x)?(x=y,1):0;}
  7. template<typename T>inline bool chkmax(T &x,T y){return (y>x)?(x=y,1):0;}
  8. inline int read(){
  9. int x;
  10. char c;
  11. int f=1;
  12. while((c=getchar())!='-' && (c>'9' || c<'0'));
  13. if(c=='-') f=-1,c=getchar();
  14. x=c^'0';
  15. while((c=getchar())>='0' && c<='9') x=(x<<1)+(x<<3)+(c^'0');
  16. return x*f;
  17. }
  18. inline ll readll(){
  19. ll x;
  20. char c;
  21. int f=1;
  22. while((c=getchar())!='-' && (c>'9' || c<'0'));
  23. if(c=='-') f=-1,c=getchar();
  24. x=c^'0';
  25. while((c=getchar())>='0' && c<='9') x=(x<<1ll)+(x<<3ll)+(c^'0');
  26. return x*f;
  27. }
  28. const int maxn=400+10,inf=0x3f3f3f3f;
  29. int f[maxn][maxn],pre[maxn][maxn];
  30. int l[maxn],r[maxn],tmp;
  31. int t[maxn][maxn],W[maxn][maxn],cnt;
  32. void dfs(int i,int j){
  33. if(pre[i][j]) dfs(i-1,pre[i][j]);
  34. printf("%d ",j);
  35. ++cnt;
  36. }
  37. int main(){
  38. #ifndef ONLINE_JUDGE
  39. freopen("placement4.in","r",stdin);
  40. freopen("placement4.out","w",stdout);
  41. #endif
  42. int n=read(),m=read(),K=read();read();
  43. int lst=1;
  44. l[++tmp]=1;
  45. while(m--){
  46. int x=read(),y=read();
  47. if(x!=lst){
  48. r[tmp]=lst;
  49. l[++tmp]=x;
  50. }
  51. lst=y;
  52. }
  53. r[tmp]=lst;
  54. REP(i,1,n) REP(j,1,K) t[i][j]=read();
  55. REP(i,1,K) REP(j,1,K) W[i][j]=read();
  56. memset(f,inf,sizeof(f));
  57. REP(T,1,tmp){
  58. REP(i,1,K) f[l[T]][i]=t[l[T]][i];
  59. REP(i,l[T]+1,r[T]) REP(j,1,K) REP(k,1,K) if(chkmin(f[i][j],f[i-1][k]+W[k][j]+t[i][j])) pre[i][j]=k;
  60. int Min=inf,num;
  61. REP(i,1,K) if(chkmin(Min,f[r[T]][i])) num=i;
  62. dfs(r[T],num);
  63. }
  64. putchar('\n');
  65. return 0;
  66. }

观察第5个测试点,每个点只会向它之后5个点以内连边,我们就只需要记录向前5个点的状态dp即可。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define REP(i,st,ed) for(register int i=st,i##end=ed;i<=i##end;++i)
  4. #define DREP(i,st,ed) for(register int i=st,i##end=ed;i>=i##end;--i)
  5. typedef long long ll;
  6. template<typename T>inline bool chkmin(T &x,T y){return (y<x)?(x=y,1):0;}
  7. template<typename T>inline bool chkmax(T &x,T y){return (y>x)?(x=y,1):0;}
  8. inline int read(){
  9. int x;
  10. char c;
  11. int f=1;
  12. while((c=getchar())!='-' && (c>'9' || c<'0'));
  13. if(c=='-') f=-1,c=getchar();
  14. x=c^'0';
  15. while((c=getchar())>='0' && c<='9') x=(x<<1)+(x<<3)+(c^'0');
  16. return x*f;
  17. }
  18. inline ll readll(){
  19. ll x;
  20. char c;
  21. int f=1;
  22. while((c=getchar())!='-' && (c>'9' || c<'0'));
  23. if(c=='-') f=-1,c=getchar();
  24. x=c^'0';
  25. while((c=getchar())>='0' && c<='9') x=(x<<1ll)+(x<<3ll)+(c^'0');
  26. return x*f;
  27. }
  28. const int maxn=500+5,inf=0x3f3f3f3f;
  29. int a[maxn][maxn];
  30. int dp[maxn][5][5][5][5][5],pre[maxn][5][5][5][5][5];
  31. int t[maxn][maxn],W[maxn][maxn];
  32. void find_pre(int n,int A,int B,int C,int D,int E){
  33. if(!n) return;
  34. find_pre(n-1,B,C,D,E,pre[n][A][B][C][D][E]);
  35. printf("%d ",A+1);
  36. }
  37. int main(){
  38. #ifndef ONLINE_JUDGE
  39. freopen("placement5.in","r",stdin);
  40. freopen("placement5.out","w",stdout);
  41. #endif
  42. int n=read(),m=read(),K=read();read();
  43. while(m--){
  44. int x=read(),y=read();
  45. a[y][y-x]=1;
  46. }
  47. REP(i,1,n) REP(j,0,4) t[i][j]=read();
  48. REP(i,0,4) REP(j,0,4) W[i][j]=read();
  49. m=K;
  50. memset(dp,inf,sizeof(dp));
  51. REP(A,0,4) REP(B,0,4) REP(C,0,4) REP(D,0,4) REP(E,0,4) dp[0][A][B][C][D][E]=0;
  52. REP(i,1,n) REP(A,0,4) REP(B,0,4) REP(C,0,4) REP(D,0,4) REP(E,0,4) if(dp[i-1][A][B][C][D][E]<inf)
  53. REP(x,0,4){
  54. int res=t[i][x];
  55. if(a[i][1]) res+=W[A][x];
  56. if(a[i][2]) res+=W[B][x];
  57. if(a[i][3]) res+=W[C][x];
  58. if(a[i][4]) res+=W[D][x];
  59. if(a[i][5]) res+=W[E][x];
  60. if(chkmin(dp[i][x][A][B][C][D],dp[i-1][A][B][C][D][E]+res)) pre[i][x][A][B][C][D]=E;
  61. }
  62. REP(A,0,4) REP(B,0,4) REP(C,0,4) REP(D,0,4) REP(E,0,4) if(dp[n][A][B][C][D][E]<=300063) find_pre(n,A,B,C,D,E);
  63. return 0;
  64. }

观察第7个测试点,发现没有运行时间很大,相当于把点和TPU进行二分图匹配。由于我们已经知道最后的答案,我们直接把边权小于等于答案的连边即可。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define REP(i,st,ed) for(register int i=st,i##end=ed;i<=i##end;++i)
  4. #define DREP(i,st,ed) for(register int i=st,i##end=ed;i>=i##end;--i)
  5. typedef long long ll;
  6. template<typename T>inline bool chkmin(T &x,T y){return (y<x)?(x=y,1):0;}
  7. template<typename T>inline bool chkmax(T &x,T y){return (y>x)?(x=y,1):0;}
  8. inline int read(){
  9. int x;
  10. char c;
  11. int f=1;
  12. while((c=getchar())!='-' && (c>'9' || c<'0'));
  13. if(c=='-') f=-1,c=getchar();
  14. x=c^'0';
  15. while((c=getchar())>='0' && c<='9') x=(x<<1)+(x<<3)+(c^'0');
  16. return x*f;
  17. }
  18. inline ll readll(){
  19. ll x;
  20. char c;
  21. int f=1;
  22. while((c=getchar())!='-' && (c>'9' || c<'0'));
  23. if(c=='-') f=-1,c=getchar();
  24. x=c^'0';
  25. while((c=getchar())>='0' && c<='9') x=(x<<1ll)+(x<<3ll)+(c^'0');
  26. return x*f;
  27. }
  28. const int maxn=600+10;
  29. int a[maxn][maxn],n,K,vis[maxn],ma[maxn];
  30. int p[maxn];
  31. int dfs(int x){
  32. if(vis[x]) return 0;
  33. vis[x]=1;
  34. REP(i,1,K) if(a[x][i])
  35. if(!ma[i] || dfs(ma[i])){
  36. ma[i]=x;
  37. return 1;
  38. }
  39. return 0;
  40. }
  41. int main(){
  42. #ifndef ONLINE_JUDGE
  43. freopen("placement7.in","r",stdin);
  44. freopen("placement7.out","w",stdout);
  45. #endif
  46. n=read();read(),K=read();read();
  47. REP(i,1,n) REP(j,1,K){
  48. int x=read();
  49. if(x<=1014) a[i][j]=1;
  50. }
  51. REP(i,1,n){
  52. memset(vis,0,sizeof(vis));
  53. dfs(i);
  54. }
  55. REP(i,1,K) p[ma[i]]=i;
  56. REP(i,1,n) printf("%d%c",p[i],i==iend?'\n':' ');
  57. return 0;
  58. }

观察第8个测试点,发现为一个分层图,且两两之间传输的权值很小,对于每一层做二分权值做二分图匹配即可。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define REP(i,st,ed) for(register int i=st,i##end=ed;i<=i##end;++i)
  4. #define DREP(i,st,ed) for(register int i=st,i##end=ed;i>=i##end;--i)
  5. typedef long long ll;
  6. template<typename T>inline bool chkmin(T &x,T y){return (y<x)?(x=y,1):0;}
  7. template<typename T>inline bool chkmax(T &x,T y){return (y>x)?(x=y,1):0;}
  8. inline int read(){
  9. int x;
  10. char c;
  11. int f=1;
  12. while((c=getchar())!='-' && (c>'9' || c<'0'));
  13. if(c=='-') f=-1,c=getchar();
  14. x=c^'0';
  15. while((c=getchar())>='0' && c<='9') x=(x<<1)+(x<<3)+(c^'0');
  16. return x*f;
  17. }
  18. inline ll readll(){
  19. ll x;
  20. char c;
  21. int f=1;
  22. while((c=getchar())!='-' && (c>'9' || c<'0'));
  23. if(c=='-') f=-1,c=getchar();
  24. x=c^'0';
  25. while((c=getchar())>='0' && c<='9') x=(x<<1ll)+(x<<3ll)+(c^'0');
  26. return x*f;
  27. }
  28. const int maxn=600+10,inf=0x3f3f3f3f;
  29. int a[maxn][maxn],t[maxn][maxn],W[maxn][maxn],co[maxn];
  30. int n,m,K,l[maxn],Nw,r[maxn],tmp,vis[maxn],ma[maxn],p[maxn];
  31. int dfs(int x){
  32. if(vis[x]) return 0;
  33. vis[x]=1;
  34. REP(i,1,K) if(a[x][i]){
  35. if(!ma[i] || dfs(ma[i])){
  36. ma[i]=x;
  37. return 1;
  38. }
  39. }
  40. return 0;
  41. }
  42. inline bool check(int x){
  43. memset(ma,0,sizeof(ma));
  44. memset(a,0,sizeof(a));
  45. int res=0;
  46. REP(i,l[Nw],r[Nw]) REP(j,1,K)
  47. if(t[i][j]<=x) a[i][j]=1;
  48. else a[i][j]=0;
  49. REP(i,l[Nw],r[Nw]){
  50. memset(vis,0,sizeof(vis));
  51. res+=dfs(i);
  52. }
  53. return res==(r[Nw]-l[Nw]+1);
  54. }
  55. int main(){
  56. #ifndef ONLINE_JUDGE
  57. freopen("placement8.in","r",stdin);
  58. freopen("placement8.out","w",stdout);
  59. #endif
  60. n=read(),m=read(),K=read();read();
  61. co[1]=1;
  62. while(m--){
  63. int x=read(),y=read();
  64. if(!co[y]) co[y]=co[x]+1;
  65. if(!co[x]) co[x]=co[y]-1;
  66. }
  67. for(int i=1,j;i<=n;i=j+1){
  68. j=i;
  69. while(j<=n && co[j+1]==co[i]) ++j;
  70. l[++tmp]=i,r[tmp]=j;
  71. }
  72. REP(i,1,n) REP(j,1,K) t[i][j]=read();
  73. int sum=0;
  74. REP(i,1,tmp){
  75. Nw=i;
  76. int L=1,R=10000;
  77. while(L<=R){
  78. int Mid=(L+R)>>1;
  79. if(check(Mid)) R=Mid-1;
  80. else L=Mid+1;
  81. }
  82. check(R+1);
  83. memset(p,0,sizeof(p));
  84. REP(j,1,K) if(ma[j]){
  85. // if(p[ma[j]]) cerr<<p[ma[j]]<<' '<<j<<endl;
  86. p[ma[j]]=j;
  87. ++sum;
  88. }
  89. REP(j,l[i],r[i]){
  90. // if(!p[j]) cerr<<j<<endl;
  91. printf("%d ",p[j]);
  92. }
  93. }
  94. // cerr<<sum<<' '<<n<<endl;
  95. return 0;
  96. }

做题答题要先一定要先观察数据!!!

LOJ2557. 「CTSC2018」组合数问题的更多相关文章

  1. LOJ 2557 「CTSC2018」组合数问题 (46分)

    题目:https://loj.ac/problem/2557 第一个点可以暴搜. 第三个点无依赖关系,k=3,可以 DP .dp[ cr ][ i ][ j ] 表示前 cr 个任务.第一台机器最晚完 ...

  2. loj#2552. 「CTSC2018」假面

    题目链接 loj#2552. 「CTSC2018」假面 题解 本题严谨的证明了我菜的本质 对于砍人的操作好做找龙哥就好了,blood很少,每次暴力维护一下 对于操作1 设\(a_i\)为第i个人存活的 ...

  3. loj #2143. 「SHOI2017」组合数问题

    #2143. 「SHOI2017」组合数问题   题目描述 组合数 Cnm\mathrm{C}_n^mC​n​m​​ 表示的是从 nnn 个互不相同的物品中选出 mmm 个物品的方案数.举个例子, 从 ...

  4. Loj #2554. 「CTSC2018」青蕈领主

    Loj #2554. 「CTSC2018」青蕈领主 题目描述 "也许,我的生命也已经如同风中残烛了吧."小绿如是说. 小绿同学因为微积分这门课,对"连续"这一概 ...

  5. Loj #2553. 「CTSC2018」暴力写挂

    Loj #2553. 「CTSC2018」暴力写挂 题目描述 temporaryDO 是一个很菜的 OIer .在 4 月,他在省队选拔赛的考场上见到了<林克卡特树>一题,其中 \(k = ...

  6. LOJ #2533. 「CTSC2018」暴力写挂(边分治合并)

    题意 给你两个有 \(n\) 个点的树 \(T, T'\) ,求一对点对 \((x, y)\) 使得 \[ depth(x) + depth(y) - (depth(LCA(x , y)) + dep ...

  7. 「CTSC2018」暴力写挂

    毫无$ Debug$能力 全世界就我会被卡空间.jpg LOJ #2553 UOJ #400 Luogu P4565 题意 给定两棵树$ T,T'$,求一组点对$ (x,y)$使得$deep(x)+d ...

  8. LOJ 2553 「CTSC2018」暴力写挂——边分治+虚树

    题目:https://loj.ac/problem/2553 第一棵树上的贡献就是链并,转化成 ( dep[ x ] + dep[ y ] + dis( x, y ) ) / 2 ,就可以在第一棵树上 ...

  9. LOJ#2552. 「CTSC2018」假面(期望 背包)

    题意 题目链接 Sol 多年以后,我终于把这题的暴力打出来了qwq 好感动啊.. 刚开始的时候想的是: 设\(f[i][j]\)表示第\(i\)轮, 第\(j\)个人血量的期望值 转移的时候若要淦这个 ...

随机推荐

  1. 第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题

    Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,…,n 编号. 设 count(x,y) 表示点 x 到点 y ...

  2. snappy

    Snappy 是一个 C++ 的用来压缩和解压缩的开发包.其目标不是最大限度压缩或者兼容其他压缩格式,而是旨在提供高速压缩速度和合理的压缩率.Snappy 比 zlib 更快,但文件相对要大 % 到 ...

  3. git [command line] fatal: Authentication failed for

    fatal: Authentication failed for https://www.jianshu.com/p/8a7f257e07b8 git.exe fetch -v --progress ...

  4. Vmware的虚拟机示例进入BIOS方法

    虚拟机(Vmware)怎么进入BIOS_百度经验 https://jingyan.baidu.com/article/7e440953e566472fc0e2eff7.html Vmware虚拟机进入 ...

  5. java中的标记接口(标签接口)

    Java中的标记接口(Marker Interface),又称标签接口(Tag Interface),具体是不包含任何方法的接口.在Java中很容易找到标记接口的例子,比如JDK中的Serialzab ...

  6. VSC软件快捷键

    Shift + Alt + F  格式化 Ctrl+Shift+P, F1显示命令面板 Ctrl+P快速打开,进入File… Ctrl + Shift + N新窗口/实例 Ctrl + Shift + ...

  7. 设计模式之原型模式(c++)

    问题描述 看到这个模式,很容易想到小时候看的<西游记>,齐天大圣孙悟空发飙的时候可以通过自己头上的 3 根毛立马复制出来成千上万的孙悟空, 对付小妖怪很管用(数量最重要). Prototy ...

  8. mongodb的安装方法

    下载安装 mongodb官网下载地址:https://www.mongodb.org/downloads#produc...直接下载.msi文件并安装到指定目录即可.我的安装路径是D:\mongodb ...

  9. select、poll、epoll之间的区别(搜狗面试)

    (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对 ...

  10. Python深入类和对象

    一. 鸭子类型和多态 1.什么是鸭子类型: 在程序设计中,鸭子类型(英语:Duck typing)是动态类型和某些静态语言的一种对象推断风格."鸭子类型"像多态一样工作,但是没有继 ...