2 条题解
-
0
#include<bits/stdc++.h> using namespace std; int f[1100][1100][2];//f[l][r][0]:l~r的灯全关而最后关的是l,f[l][r][1]:l~r的灯全关而最后关的是r int s[1100]; struct node{int p,w;}a[1100];//p是位置,w是功耗 bool cmp(node n1,node n2){return n1.p<n2.p;} int main() { int n,st;scanf("%d%d",&n,&st); for(int i=1;i<=n;i++)scanf("%d%d",&a[i].p,&a[i].w); sort(a+1,a+n+1,cmp); s[0]=0;for(int i=1;i<=n;i++) s[i]=a[i].w+s[i-1]; memset(f,0x3f,sizeof(f)); for(int i=1;i<=n;i++) f[i][i][0]=f[i][i][1]=abs(a[i].p-a[st].p)*s[n];//在走过st-i的这段路,所有灯都在消耗 for(int L=2;L<=n;L++)//长度 { for(int l=1,x,y,r;l<=n-L+1;l++)//起点 { r=l+L-1; x=f[l+1][r][0]+(s[n]-(s[r]-s[l]))*(a[l+1].p-a[l].p); y=f[l+1][r][1]+(s[n]-(s[r]-s[l]))*(a[r].p-a[l].p); f[l][r][0]=min(x,y); x=f[l][r-1][0]+(s[n]-(s[r-1]-s[l-1]))*(a[r].p-a[l].p); y=f[l][r-1][1]+(s[n]-(s[r-1]-s[l-1]))*(a[r].p-a[r-1].p); f[l][r][1]=min(x,y); } } printf("%d\n",min(f[1][n][0],f[1][n][1])); return 0; } -
0
#include<bits/stdc++.h> using namespace std; int f[1100][1100][2];//f[l][r][0]:l~r的灯全关而最后关的是l, f[l][r][1]:l~r的灯全关而最后关的是r int s[1100]; struct node{int p,w;}a[1100];//p是位置,w是功耗 bool cmp(node n1,node n2){return n1.p<n2.p;} int main() { int n,st;scanf("%d%d",&n,&st); for(int i=1;i<=n;i++)scanf("%d%d",&a[i].p,&a[i].w); sort(a+1,a+n+1,cmp); s[0]=0;for(int i=1;i<=n;i++) s[i]=a[i].w+s[i-1]; memset(f,0x3f,sizeof(f)); for(int i=1;i<=n;i++) f[i][i][0]=f[i][i][1]=abs(a[i].p-a[st].p)*s[n];//在走过st-i的这段路,所有灯都在消耗 for(int L=2;L<=n;L++)//长度 { for(int l=1,x,y,r;l<=n-L+1;l++)//起点 { r=l+L-1; x=f[l+1][r][0]+(s[n]-(s[r]-s[l]))*(a[l+1].p-a[l].p); y=f[l+1][r][1]+(s[n]-(s[r]-s[l]))*(a[r].p-a[l].p); f[l][r][0]=min(x,y); x=f[l][r-1][0]+(s[n]-(s[r-1]-s[l-1]))*(a[r].p-a[l].p); y=f[l][r-1][1]+(s[n]-(s[r-1]-s[l-1]))*(a[r].p-a[r-1].p); f[l][r][1]=min(x,y); } } printf("%d\n",min(f[1][n][0],f[1][n][1])); return 0; }
- 1
信息
- ID
- 29
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 47
- 已通过
- 24
- 上传者