デイリーアルゴリズム - 33日

デイリーアルゴリズム

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


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

2020年3月19日


luogu- p1095のライエスケープ

DP +貪欲、もちろん、検索が終わっていない、とあまりにもプルーニングすることはできません。それは元の構造を保持しますが、どちらが3つの下部のがベストです、それはDPの最適なサブ構造の性質に影響を与えることはありませんが、あまりにも多くのデータ、重量変化の2回目の反復、。最後に、境界線の初期化に注意を払うには、貪欲の貪欲は、実際にフラッシュが点滅することができます

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

using namespace std;
const int N = 300005;
int m , s , t ;
int f[N]; 
/*
    将原问题分解为: 每秒钟能够移动的最大距离 
    1. 魔法瞬移  +60m, 魔法 m - 10
    2. 按照跑步  17 m/s
    3. 原地休息  恢复魔法的速率为 4点/s
*/
int main()
{
    cin >> m >> s >> t;
    for(int i = 1;i <= t; ++i)
    {
        if(m >= 10){
            f[i] = f[i-1] + 60;
            m-=10;
        }else{
            f[i] = f[i - 1];
            m += 4;
        }
    }
    
    for(int i = 1;i <= t ; ++i)
    {
        if(f[i] < f[i - 1] + 17)f[i] = f[i - 1] + 17;
        if(f[i] >= s)
        {
            printf("Yes\n%d",i);
            return 0;
        }
    }
    printf("No\n%d",f[t]);
    return 0;
} 

ゲームをフェッチ-p1123 luogu

各番号の2つだけの状態、選挙又は全く選挙は、選挙恐ろしい最後の言葉は、状態を復元します。それは数値の列挙のおかげですべての時間の列挙であるため、列挙型は、指数と比較することができます

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

using namespace std;
const int N = 10;

int a[N][N] , n , m , t;
int vis[N][N]; 
int dir[8][2] = {{1,0},{0,1},{-1,0},{0,-1},
{1,1},{1,-1},{-1,1},{-1,-1}};
int ans = 0;

void turn(int x,int y,bool flag) 
{
    for(int i = 0;i < 8;i ++)
    {
        int nx = x + dir[i][0];
        int ny = y + dir[i][1];
        if(flag)vis[nx][ny] ++;
        else vis[nx][ny]--;
    }
}

void dfs(int x,int y,int val)
{
    if(y == m + 1)
    {
        dfs(x + 1, 1 , val);
        return;
    }
    if(x == n + 1)
    {
        ans = max(val , ans);
        return;
    }
    
    dfs(x , y + 1,val); // 不取这个数
    
    if(!vis[x][y])
    {
        turn(x , y , 1);
        dfs(x , y + 1 , val + a[x][y]);
        turn(x , y , 0);
    } 
}

void input()
{
     cin >> n >> m;
     for(int i = 1;i <= n ;i ++)
     {
        for(int j = 1;j <= m ;j ++)
        {
            cin >> a[i][j];
        }
     }
}

void clear()
{
    fill(a[0],a[0] + N * N,0);
    fill(vis[0],vis[0] + N * N, 0);
    ans = 0;
}

int main()
{
    cin >> t;
    while(t--)
    {
        input();
        dfs(1,1,0);
        cout << ans << endl;
        clear();
    }
    return 0;
} 

luogu -P1413ナッツボウリング

また貪欲、貪欲な私はあまりにもサンプルできる理由QAQの取得
叫びを、私Shetenglebantianは最終的に、今日のタスクを完了して与えます。

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

using namespace std;

struct node{
    int row,time;
};
vector<node> v;
int n;
bool vis[7];
bool cmp(node a,node b)
{
    if(a.row == b.row)
    {
        return a.time < b.time;
    }else return a.row < b.row;
}
int main()
{
    cin >> n;
    int a, b ;
    for(int i = 0;i < n ;i ++)
    {
        cin >> a >> b;
        v.push_back({a , b});
    }   
    sort(v.begin(),v.end(),cmp);
    long long ans = 0;
    int r = v[0].row, t = v[0].time;
    for(int i = 1;i < v.size() ;i ++)
    {
        if(v[i].row != r)
        {
            ans++;
            r = v[i].row;
            t = v[i].time;
            continue;   
        }
        if(v[i].time - t >= 60)
        {
            ans++;
            t = v[i].time;  
        }   
    }
    cout << ans + 1 << endl;
    return 0;
} 

おすすめ

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