From 5f7301d876f9268154c9728386a1e6cdd017201c Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Tue, 22 Jul 2025 15:25:27 +0800 Subject: [PATCH] update --- .gitignore | 3 ++- src/7/22/P1282.cpp | 45 +++++++++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index e050ba0..79e6206 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /build -/.cache \ No newline at end of file +/.cache +/test.* \ No newline at end of file diff --git a/src/7/22/P1282.cpp b/src/7/22/P1282.cpp index 91fa5de..75f8f21 100644 --- a/src/7/22/P1282.cpp +++ b/src/7/22/P1282.cpp @@ -3,26 +3,24 @@ #include #include #include +#include #include using ll = int64_t; -ll n,a,b; +ll n,a,b,ans=std::numeric_limits::max(); std::vector> dp; +constexpr ll idxa = 6000+7; template -void log(Ts&&...ts){ +static inline __attribute__((always_inline)) void log(Ts&&...ts){ std::cout<<"Log: "; ((std::cout<>n; - dp.resize(n+1,std::vector(2)); + dp.resize(2,std::vector(2*idxa+1,std::numeric_limits::max()-7)); + getdp(0, 0)=0; for(ll i=1;i<=n;i++){ /* - dp[k][0] dp[k][1] + i=前i个 <=1000 + j=当前的差值 -6000<=j<=6000 + k为最小翻转次数 <=1000 + dp[i][j]=k + O(1000*12000)=1e7 */ std::cin>>a>>b; - if(abs(dp[i-1][0]+a-b)=-6000;j--){ + getdp(i, j)=std::min(getdp(i, j),getdp(i-1, j-(a-b))); + getdp(i, j)=std::min(getdp(i, j),getdp(i-1, j-(-a+b))+1); } - if(abs(dp[i-1][0]+b-a)::max()-7); + } + for(ll i=0;i<=6000;i++){ + if(getdp(n, i)<=1000){ + std::cout<