mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-08-21 18:52:07 +00:00
update
This commit is contained in:
parent
df6c28199c
commit
5f7301d876
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
/build
|
||||
/.cache
|
||||
/.cache
|
||||
/test.*
|
@ -3,26 +3,24 @@
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <istream>
|
||||
#include <limits>
|
||||
#include <vector>
|
||||
|
||||
using ll = int64_t;
|
||||
|
||||
ll n,a,b;
|
||||
ll n,a,b,ans=std::numeric_limits<ll>::max();
|
||||
std::vector<std::vector<ll>> dp;
|
||||
constexpr ll idxa = 6000+7;
|
||||
|
||||
template<class ...Ts>
|
||||
void log(Ts&&...ts){
|
||||
static inline __attribute__((always_inline)) void log(Ts&&...ts){
|
||||
std::cout<<"Log: ";
|
||||
((std::cout<<ts<<' '),...);
|
||||
std::cout<<'\n';
|
||||
}
|
||||
|
||||
void pdp(){
|
||||
std::cout<<"{";
|
||||
for(ll i=0;i<dp.size();i++){
|
||||
std::cout<<"{"<<dp[i][0]<<","<<dp[i][1]<<"}, ";
|
||||
}
|
||||
std::cout<<"}\n";
|
||||
static inline __attribute__((always_inline)) ll& getdp(ll i,ll j){
|
||||
return dp[i%2][j+idxa];
|
||||
}
|
||||
|
||||
int main(){
|
||||
@ -31,23 +29,30 @@ int main(){
|
||||
std::cout.tie(nullptr);
|
||||
|
||||
std::cin>>n;
|
||||
dp.resize(n+1,std::vector<ll>(2));
|
||||
dp.resize(2,std::vector<ll>(2*idxa+1,std::numeric_limits<ll>::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)<abs(dp[i-1][1]+a-b)){
|
||||
dp[i][0]=dp[i-1][0]+a-b;
|
||||
}else{
|
||||
dp[i][0]=dp[i-1][1]+a-b;
|
||||
for(ll j=6000;j>=-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)<abs(dp[i-1][1]+b-a)){
|
||||
dp[i][1]=dp[i-1][0]+b-a;
|
||||
}else{
|
||||
dp[i][1]=dp[i-1][1]+b-a;
|
||||
dp[i%2==1?0:1].assign(2*idxa+1,std::numeric_limits<ll>::max()-7);
|
||||
}
|
||||
for(ll i=0;i<=6000;i++){
|
||||
if(getdp(n, i)<=1000){
|
||||
std::cout<<getdp(n, i)<<'\n';
|
||||
break;
|
||||
}else if(getdp(n, -i)<=1000){
|
||||
std::cout<<getdp(n, -i)<<'\n';
|
||||
break;
|
||||
}
|
||||
}
|
||||
pdp();
|
||||
std::cout<<std::min(abs(dp[n][0]),abs(dp[n][1]))<<'\n';
|
||||
}
|
Loading…
Reference in New Issue
Block a user