ICPC南東ヨーロッパコンテスト2019

B(DP)

最も重要なことは、同じステージでの状態遷移の影響です。

01バックパックの最適化がフラッシュバックを必要とする理由と同じように、この質問はフラッシュバックだけでなく、この段階で転送を保存し、最終的に均一に保存することでもあります。

移管の同じ段階で相互影響を回避するには

もちろん、並べ替えについては、アップグレードしたい経験が多ければ多いほど良いと思います。

#include <bits / stdc ++。h>
 #define RE register
 #define P pair <int、int>
 #define PP pair <P、P>
 #define ll long long
 using using  namespace std; 

int n、x、y; 
ll f [ 501 ] [ 501 ]、ff [ 501 ] [ 501 ]; 
PP a [ 501 ]; 

bool cmp(PP a、PP b)
{ 
    return a.first.first < b.first.first; 
} 

int main()
{ 
    scanf(" %d%d%d "、&​​n、&x、& y);
    memset(f、0x3f3f3f3fsizeof f); 
    memset(ff、0x3f3f3f3fsizeof ff); 
    llフラグ = f [ 0 ] [ 0 ]; 
    f [ 0 ] [ 0 ] = 0 ;
    for(RE int i = 1 ; i <= n; ++ i)
        scanf(" %d%d%d%d "、&​​a [i] .first.first、&a [i] .first.second、&a [ i] .second.first、&a [i] .second.second); 
    sort(a + 1、a + 1 + n、cmp);
    以下のためにint型私は= 1 ; i <= n; ++ i)
    { 
        forint c = 0 ; c <= x; ++ c)
             forint d = 0 ; d <= y; ++ d)
                ff [c] [d] = f [c] [ d];
        forint c = x; c> = 0 ; -c)
             forint d = y; d> = 0 ; -d)
            { 
                if(f [c] [d] == flag)continue ;
                もし(c!=x)
                { 
                    int nc = c + a [i] .first.first;
                    int nd = d;
                    if(nc> x)nd + = nc-x、nc = x; 
                    nd = min(nd、y); 
                    ff [nc] [nd] = min(ff [nc] [nd]、f [c] [d] + a [i] .first.second); 
                } 
                int nd = min(d + a [i] .second.first、y); 
                ff [c] [nd] = min(ff [c] [nd]、f [c] [d] + a [i] .second.second); 
            } 
        forint c = 0 ; c <= x; ++ c)
             forint d = 0 ; d <= y; ++ d)
                f [c] [d] = ff [c] [d]; 
    } 
    if(f [x] [y] == flag)f [x] [y] = -1 ; 
    printf(" %lld " 、f [x] [y]);
    0を返し ます
}

D(終了)

#include <bits / stdc ++。h>
 using  namespace std; 

char s [ 1000005 ];
int a [ 26 ]、len = 1 、n; 
vector < int > ve; 

int main()
{ 
    scanf(" %s "、s + 1 );
    forint&i = len; s [i]; ++ i)++ a [s [i]- ' a ' ];
    --len; len >> = 1 ;
    forint i = 0 ; i < 26; ++ i)
         if(a [i]> = len)ve.emplace_back(i)、++ n;
        else  if(a [i])++ n;
    if(ve.size()> 1 ||(ve.size()== 1 && n < 3 ))
    { 
        puts(" NO " );
        0を返し ます
    } 
    puts(" YES " ); 
    if(!ve.empty())
    { 
        a [ve [ 0 ]]-= len;
        forint i =1 ; i <= len; ++ i)printf(" %c "、ve [ 0 ] + ' a ' );
        forint i = 0 ; i < 26 ; ++ i)
             if(a [i] && i!= ve [ 0 ])
            {--
                 a [i]; printf(" %c "' a ' + i);
                休憩; 
            } 
        while(a [ve [ 0 ]]-)printf(" %c "、ve [ 0] + ' a ' ); 
    } 
    forint i = 0 ; i < 26 ; ++ i)
         while(a [i]> 0)printf(" %c "、i + ' a ')、- a [i];    
    0を返し ます
}

F(木のトリミング、nim)

#include <bits / stdc ++。h>
 using  namespace std; 

const  int N = 1e5 + 5 ; 

vector < int > vec [N];
int n; 

int dfs(int u、int fa)
{ 
    int re = 0 ;
    forint i = 0 ; i <vec [u] .size(); ++ i) 
         if(vec [u] [i]!= fa)
            re ^ = 1 + dfs(vec [u] [i]、 u);
    reを返す; 
} 

intmain()
{ 
        scanf(" %d "、&n);
        forint i = 1、a、b; i <n; ++ i)
        { 
            scanf(" %d%d "、&​​a、&b); 
            vec [a] .push_back(b); 
            vec [b] .push_back(a); 
        } 
    のprintf(DFS(10)?" アリス"" ボブ" )。
    0を返し ます
}    

 

おすすめ

転載: www.cnblogs.com/2aptx4869/p/12687880.html