比赛 cdcqの省选膜你赛 评测结果 AWWWWWTTTTTTWWWWWWWW
题目名称 源符「厌川的翡翠」 最终得分 5
用户昵称 Marvolo 运行时间 12.622 s
代码语言 C++ 内存使用 0.44 MiB
提交时间 2017-04-11 21:53:56
显示代码纯文本
  1. #pragma GCC optimize(3)
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<iostream>
  5. #include<algorithm>
  6. #define N 155
  7. #define M 3500
  8. #define INF 0x3f3f3f3f
  9. using namespace std;
  10.  
  11. int i,n,m,w,Ans=INF,ans,cnt,lsum=1,t,x,y,j;
  12. int a[N][N];
  13. int f[N],c[N],head[N];
  14.  
  15. struct Line{
  16. int t,next;
  17. }e[M];
  18.  
  19. inline int Abs(int x){return (x<0)?-x:x;}
  20. inline int Min(int x,int y){return (x<y)?x:y;}
  21. inline int Max(int x,int y){return (x>y)?x:y;}
  22.  
  23. inline void Add(int s,int t){
  24. e[lsum].t=t; e[lsum].next=head[s]; head[s]=lsum++;
  25. }
  26.  
  27. inline void Work(){
  28. int i=0,j=0;
  29. for (i=1;i<=n;i++) f[i]=i;
  30. while (1){
  31. for (i=1;i<=n;i++) c[i]=a[i][f[i]];
  32. cnt=0; ans=0;
  33. for (i=1;i<=n;i++) cnt+=c[i];
  34. if (cnt>w) goto Flag;
  35. for (i=1;i<=n;i++)
  36. for (j=head[i];j;j=e[j].next)
  37. ans=Max(ans,Abs(f[i]-f[e[i].t]));
  38. Ans=Min(Ans,ans);
  39. Flag:
  40. if (!next_permutation(f+1,f+1+n)) break;
  41. }
  42. if (Ans==INF) printf("-1\n"); else printf("%d\n",Ans);
  43. }
  44.  
  45. int main(){
  46. freopen("cdcq_c.in","r",stdin);
  47. freopen("cdcq_c.out","w",stdout);
  48. scanf("%d%d%d%d",&n,&m,&w,&t);
  49. for (i=1;i<=m;i++){
  50. scanf("%d%d",&x,&y);
  51. Add(x,y);
  52. }
  53. for (i=1;i<=n;i++)
  54. for (j=1;j<=t;j++)
  55. scanf("%d",&a[i][j]);
  56. if (n<=40) Work(); else printf("-1\n");
  57. return 0;
  58. }