[关闭]
@xiaoziyao 2021-03-24T15:31:41.000000Z 字数 1342 阅读 1176

P3344 [ZJOI2015]幻想乡 Wi-Fi 搭建计划解题报告

解题报告


P3344 [ZJOI2015]幻想乡 Wi-Fi 搭建计划解题报告:

题意

分析

代码

  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<math.h>
  4. #include<string.h>
  5. using namespace std;
  6. const int maxn=105;
  7. int n,m,R,as,bs,ps,ans,sum;
  8. int f[maxn][maxn][maxn],ok[maxn];
  9. struct point{
  10. int x,y,c;
  11. }p[maxn],w[maxn],above[maxn],below[maxn],place[maxn];
  12. inline int cmp(point a,point b){
  13. return a.x<b.x;
  14. }
  15. inline int check(point a,point b){
  16. return 1ll*(a.x-b.x)*(a.x-b.x)+1ll*(a.y-b.y)*(a.y-b.y)<=1ll*R*R;
  17. }
  18. int main(){
  19. scanf("%d%d%d",&n,&m,&R);
  20. for(int i=1;i<=n;i++)
  21. scanf("%d%d",&p[i].x,&p[i].y);
  22. for(int i=1;i<=m;i++){
  23. int x,y,c;
  24. scanf("%d%d%d",&x,&y,&c),sum+=c;
  25. w[i].x=x,w[i].y=y,w[i].c=c;
  26. for(int j=1;j<=n;j++)
  27. if(check(w[i],p[j]))
  28. ok[j]=1;
  29. if(y>R)
  30. above[++as]=w[i];
  31. if(y<0)
  32. below[++bs]=w[i];
  33. }
  34. for(int i=1;i<=n;i++)
  35. if(ok[i])
  36. place[++ps]=p[i];
  37. sort(above+1,above+1+as,cmp),sort(below+1,below+1+bs,cmp),sort(place+1,place+1+ps,cmp);
  38. memset(f,0x3f,sizeof(f));
  39. ans=sum,f[0][0][0]=0;
  40. for(int i=1;i<=ps;i++)
  41. for(int a=0;a<=as;a++)
  42. for(int b=0;b<=bs;b++){
  43. if((a>0&&check(above[a],place[i]))||(b>0&&check(below[b],place[i])))
  44. f[i][a][b]=min(f[i][a][b],f[i-1][a][b]);
  45. if(i==ps)
  46. ans=min(ans,f[i][a][b]);
  47. for(int k=a+1;k<=as;k++)
  48. if(check(above[k],place[i]))
  49. f[i][k][b]=min(f[i][k][b],f[i-1][a][b]+above[k].c);
  50. for(int k=b+1;k<=bs;k++)
  51. if(check(below[k],place[i]))
  52. f[i][a][k]=min(f[i][a][k],f[i-1][a][b]+below[k].c);
  53. }
  54. printf("%d\n%d\n",ps,ans);
  55. return 0;
  56. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注