デイリーアルゴリズム - 25日目

デイリーアルゴリズム

あなたは早起きして、あなたが懸命に働くそれらの時。あなたは夜更かしして、懸命に働くそれらの時。当時は作業のように感じていない場合 - あなたはあまりにも疲れている、あなたは自分自身をプッシュする必要はありません - しかし、あなたはとにかくそれを行います。それは実際には夢です。それは夢です。それは旅だ、目的地ではありません。あなたたちはそれを理解することができればと、何が起こる参照してくださいよと、あなたがあなたの夢を達成しないことを、あなたの夢が叶うません、何か大きな意志です。マンバアウト


あなたが疲れを感じるが、それでも夢を追いかけて、おそらくあなたができない、何があっエンドのプロセスを楽しむために道を気にしないことをするとき、歯に付着していたときに、予備のハードワークを支払うものは、あなたが、訓練する必要はありません成功を夢見たが、後に続く多くの素晴らしいものがあるでしょう。マンバアウト〜

2020年3月10日


luogu -P1376機械工場

欲を実装することだと思っているが、変換の問題貪欲戦略は、暴力の固定フォームから死ななければならないことに注意、多くのスキルがあります

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>

using namespace std;
int n , s , c , y;

int main()
{
    cin >> n >> s;
    int a, b ,ans = 0;
    long long  sum = 0;
    cin >> a >> b;
    ans = a;
    sum += ans * b;
    //如果留有剩余就相当于在基础价格上加上s 和当前取min 
    for(int i = 1;i < n ;i ++)
    {
        scanf("%d %d",&a, &b);
        ans = min(ans + s,a);  
        sum += ans * b;
    }
    cout << sum << endl;
    return 0;
} 

luogu -P1219 [USACO1.5]八クイーンズチェッカーチャレンジ

#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;
const int N = 110;

int n; 
int A[N] , B[N] , C[N] , D[N];
int cnt = 0;

bool check(int i,int j)
{
    if((!B[j]) && (!C[i+j]) && (!D[i-j+n]))return 1;
    else return 0;
}
void turnup(int i,int j)
{
    A[i] = j;B[j] = 1;C[i+j] = 1;D[i-j+n] = 1;
}
void turndown(int i,int j)
{
    B[j] = 0;C[i+j] = 0;D[i-j+n] = 0;
}

void print()
{
    for(int i = 1;i <= n;i ++)cout << A[i] << " ";
    cout << endl;
}
void dfs(int now)
{
    if(now > n)
    {
        if(cnt < 3)print();
        cnt++;
    }
    for(int i = 1;i <= n;i ++)
    {
        if(check(now,i)) 
        {
            turnup(now,i);
            dfs(now + 1);
            turndown(now,i);                        
        }
    }
} 
int main()
{
    cin >> n;
    dfs(1); 
    cout << cnt;
    return 0;
}

luogu- P1130レッド(DP)

#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;
const int N = 2005;
int a[N][N],  f[N][N], n , m;
int main()
{
    cin >> n >> m;
    
    for(int i = 1;i <= m ;i ++)
    {
        for(int j = 1;j <= n ;j ++)
        {
            scanf("%d",&a[j][i]);
        }
    }
    
    for(int i = 1;i <= n ;i ++)
    {
        f[i-1][0] = f[i-1][m];
        for(int j = 1;j <= m ;j ++)
        {
            f[i][j] = min(f[i-1][j-1],f[i-1][j]) + a[i][j];
        }
    }
    
    int ans = f[n][1];
    for(int i = 2;i <= m ;i ++)
    {
        ans = min(ans,f[n][i]);
    }
    cout << ans << endl;
    return 0;
} 

luogu- P1130レッドカード(のメモリ)

時にはそれのメモリはまだ非常に悩まされているトーン

#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;
const int N = 2005;
int a[N][N],  f[N][N], n , m;

int dfs(int i,int j)
{
    if(f[i][j] != -1)return f[i][j];
    if(i == n + 1)
    {
        return f[i][j] = 0;
    }
    int x = 0x3f3f3f3f, y = 0x3f3f3f3f; // 主义这里要初始化得足够大 
    x = dfs(i + 1, j);  
    int jj = j + 1;
    if(jj > m)jj -= m; //如果超出就直接回去访问第一个 
    y = dfs(i + 1,jj);
    f[i][j] = min(x,y) + a[i][j];
    return f[i][j];
}

void print()
{
    for(int i = 1;i <= n;i ++)
    {
        for(int j = 1;j <= m + 1 ;j ++)
        {
            cout << f[i][j] << " ";
        }
        cout << endl;
    }
}
int main()
{
    cin >> n >> m;
    fill(f[0],f[0] + N * N,-1);
    for(int i = 1;i <= m ;i ++)
    {
        for(int j = 1;j <= n ;j ++)
        {
            scanf("%d",&a[j][i]);
        }   
    }
    int ans = 1 << 30;  //这里要把ans 取得足够大 
    for(int i = 1;i <= m;i ++)
    {
        ans = min(ans,dfs(1,i));
    }
    cout << ans << endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/wlw-x/p/12459731.html