1. 程式人生 > 其它 >Codeforces Round #744 (Div. 3) G. Minimal Coverage

Codeforces Round #744 (Div. 3) G. Minimal Coverage

傳送門

題意

給一串卡片,每個卡片有一個長度。將這串卡片進行摺疊,但必須保持首尾相接,類似於一沓點卡。問最小的摺疊後的寬度。

分析

首先題目給的是從0點出發。但實際上我們可以讓出發點不固定,這樣可以固定左端點,可以假設最終的左端點是原點。那麼設定一個dp 。其中 dp[i][j] 表示前 i 個卡片以 j 為最後放置的銜接點時右端點離當前 j 點的最小距離 。那麼最後統計答案可以列舉最後一個銜接點的位置 j,此時整體右端點就是 j+dp[n][j] 而左端點是固定的0.此時答案就是 j+dp[n][j] 。取所有答案的最小值。

程式碼

#include<bits/stdc++.h>
using
namespace std; typedef long long ll; const int mod=998244353; const int N=200005; int prime[1100000],primesize; bool isprime[11000000]; ll f[N],invf[N]; ll inv[N]; void getlist(int listsize){ memset(isprime,1,sizeof(isprime)); isprime[1]=false; for(int i=2;i<=listsize;i++){ if(isprime[i])prime[++primesize]=i;
for(int j=1;j<=primesize&&i*prime[j]<=listsize;j++) { isprime[i*prime[j]]=false; if(i%prime[j]==0) break; } } } void extend_gcd(ll a, ll b, ll& d, ll& x, ll& y) { if(!b){ d = a; x = 1; y = 0; } else { extend_gcd(b, a%b,d, y, x); y -= x*(a/b);} }
void ni(int n) { inv[0] = inv[1] = 1; for(int i = 2; i <= n; i++) { inv[i] = (mod - (mod/i))*inv[mod%i]%mod; } } ll fpow(ll a,ll k){ ll res=1; while(k){ if(k&1) res=(res*a)%mod; k>>=1; a=a*a%mod; //cout<<1<<endl; } return res; } void init(int n){ f[0]=1; for(int i=1;i<=n;++i){ f[i]=f[i-1]*i%mod; } invf[n]=fpow(f[n],mod-2); for(int i=n-1;i>=0;--i){ invf[i]=invf[i+1]*(i+1)%mod; } } ll C(int n,int k){ if(k<0 || k>n) return 0; return f[n]*invf[k]%mod*invf[n-k]%mod; } ll a[2005]; ll dp[10005][2005]; void solve(){ ll n; cin>>n; for(int i=1;i<=n;i++){ memset(dp[i],0x3f,sizeof(dp[i])); } memset(dp[0],0,sizeof(dp[0])); for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ for(int j=0;j<=2000;j++){ ll te=max((ll)0,j-a[i]); dp[i][te]=min(dp[i][te],a[i]+dp[i-1][j]); te=j+a[i]; if(te<=2000){ dp[i][te]=min(dp[i][te],max((ll)0,dp[i-1][j]-a[i])); } } } ll ans=0x3f3f3f3f3f3f3f3f; for(int i=0;i<=2000;i++){ ans=min(ans,i+dp[n][i]); } cout<<ans<<endl; } int main(){ ios::sync_with_stdio(false);cin.tie(0); // getlist(1e7); int t=1; cin>>t; while(t--){ solve(); } }
rush!