NOIPシミュレーション演習5

NOIPシミュレーション演習5

  • 300のうち、I 240。300改正後。
  • ミディアム困難。

宇宙パスワード

説明

  • 人間は、科学者たちは、この目的のために巨大な電波望遠鏡を構築し、地球外文明を探索することを約束されている
    宇宙線を受信します。深宇宙から1日相次ぐ神秘的な波は、各波が三元の文字列とみなすことができる
    から成るすなわち数が、0、1、2、最も特に電波分析によるもの40以上の長さは、示されたその多数の:電気の各列
    の連続する0の波はいません。科学者たちは、謎を解読するためには、電波がエイリアンのパスワードが含まれている疑いがある、
    と今では、プログラム、電波の総数Nの要件を満たすために、統計長を記述します。
    例えば:01、02、10、11、12、20、21、22:N = 2、8と電波の要件を満たすようにします。00不満が
    連続0があったので、要件を満たして

入力

  • Password.in入力ファイルは以上40 Nの正の整数、文字列の波長が与えられます。
    データ1≤N≤15の50%。

出力

  • これは、ファイルではなく、連続する0 N.のpassword.out文字列の数の長さを与えます

サンプル入力

2

サンプル出力

8

ソリューション:

  • DP。

  • DP(I、0/1/2)を設定すると、その要求は、DP(N、0)+ DP(N、1)+ DP(nは、であり、プログラムの数は、i番目の0/1/2であることを示し2)。転送は非常に簡単です、コードを参照してください。

#include <iostream>
#include <cstdio>
#define N 55
using namespace std;

long long n;
long long f[N][4];

int main()
{
    cin >> n;
    f[1][0] = f[1][1] = f[1][2] = 1;
    for(int i = 2; i <= n; i++)
        f[i][0] = f[i - 1][1] + f[i - 1][2],
        f[i][1] = f[i - 1][0] + f[i - 1][1] + f[i - 1][2],
        f[i][2] = f[i - 1][0] + f[i - 1][1] + f[i - 1][2];
    cout << f[n][0] + f[n][1] + f[n][2];
    return 0;
}

ジョブスケジューリングプログラム

トピック:

ソリューション:

  • シミュレーション。
  • この質問は、タイトルに理解しやすい、実際には、問題解決のアプローチでは困難な課題である、話題を読んシミュレーションの質問です。以下は翻訳版です。

  • N加工ワークのM個のセットは、異なる指定されたマシン上で完了各プロセスは、各ワークピースがm個のステップを有し、そこです。各プロセスは、処理時間毎に指定されています。今、あなたを与えるために、「配置順を、」あなたは、アナログ「の順配置する」ご注文最終的にこれらのタスクを取る完了するまでに最短時間を決定するために。
  • 何が、シミュレーションああを唖然!

#include <iostream>
#include <cstdio>
#define N 25
#define inf 0x7fffffff
using namespace std;

struct A {int obj, id, val, las;} a[N * N];
struct B {int id, val;} b[N][N];
int n, m, ans;
int g[N], t[N];
int form[N][405];

bool check(int id, int l, int r)
{
    for(int i = l; i <= r; i++)
        if(form[id][i]) return 0;
    return 1;
}

void cal(int obj, int id, int val, int las)
{
    if(!las)
    {
        for(int i = 1; ; i++)
            if(check(id, i, i + val - 1))
            {
                for(int j = i; j <= i + val - 1; j++)
                    form[id][j] = obj;
                t[id] = max(t[id], i + val - 1);
                break;
            }
        return;
    }
    int idd = a[las].id, pos;
    for(int i = t[idd]; i >= 1; i--)
        if(form[idd][i] == obj) {pos = i; break;}
    for(int i = pos + 1; ; i++)
        if(check(id, i, i + val - 1))
        {
            for(int j = i; j <= i + val - 1; j++)
                form[id][j] = obj;
            t[id] = max(t[id], i + val - 1);
            break;
        }
}

int main()
{
    cin >> m >> n;
    for(int i = 1; i <= m * n; i++) cin >> a[i].obj;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> b[i][j].id;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> b[i][j].val;
    for(int i = 1; i <= m * n; i++)
        a[i].id = b[a[i].obj][++g[a[i].obj]].id,
        a[i].val = b[a[i].obj][g[a[i].obj]].val;
    for(int i = 1; i <= m * n; i++)
    {
        int x = a[i].obj;
        for(int j = i - 1; j >= 1; j--)
            if(a[j].obj == x) {a[i].las = j; break;}
    }
    for(int i = 1; i <= m * n; i++)
        cal(a[i].obj, a[i].id, a[i].val, a[i].las);
    for(int i = 1; i <= m; i++) ans = max(ans, t[i]);
    cout << ans;
    return 0;
}

街中に水

トピック:

ソリューション:

  • BFS +貪欲。
  1. 左の境界、右境界の制御を超えた各点について計算BFS。

  2. それは乾燥地域に到達したかどうかを示す全然見て。ステップ4で入力することができ、3に進みません。

  3. どのように多くの乾燥地域に構築することができない施設、出力の答えを見て、再びそれをスイープ。ステップ5に進みます。

  4. 再び貪欲実行間隔カバレッジ、出力答え。ステップ5に進みます。

  5. 終わり。

  • 質問は、各点の左右のエッジの間、これらの乾燥地帯にあなたがそれを制御することができることを知っていますか、制御することができますか?言い換えれば、どのようにそれはそれの範囲に制御する必要があります知っていますか?
  • 大きなブログはお勧め、良い話します。
  • 最後に、ローカルに私のコードAC、羅バレー90ptsタイムアウトポイント、追加。その後、データの記憶を増強すると言われています私は私が修正され続けていない怠け者。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define N 505
#define inf 0x7fffffff
using namespace std;

struct E {int l, r;} e[N];
struct Node {int x, y, h;};
int n, m, last, ans;
int a[N][N];
bool tag[N];
bool vis[N][N];
int dx[5] = {0, -1, 1, 0, 0};
int dy[5] = {0, 0, 0, -1, 1};

int read()
{
    int x = 0, f = 1; char c = getchar();
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
    return x *= f;
}

void bfs(int x, int y, int dfn)
{
    queue<Node> que;
    memset(vis, 0, sizeof(vis));
    Node tmp;
    tmp.x = x, tmp.y = y, tmp.h = a[x][y];
    que.push(tmp), vis[x][y] = 1;
    while(que.size())
    {
        Node now = que.front(); que.pop();
        for(int i = 1; i <= 4; i++)
        {
            tmp.x = now.x + dx[i], tmp.y = now.y + dy[i], tmp.h = a[tmp.x][tmp.y];
            if(now.h > tmp.h && !vis[tmp.x][tmp.y] && tmp.x >= 1 && tmp.x <= n && tmp.y >= 1 && tmp.y <= m)
            {
                vis[tmp.x][tmp.y] = 1;
                que.push(tmp);
            }
        }
    }
    for(int i = 1; i <= m; i++)
        if(vis[n][i]) {e[dfn].l = i; break;}
    for(int i = m; i >= 1; i--)
        if(vis[n][i]) {e[dfn].r = i; break;}
    for(int i = e[dfn].l; i <= e[dfn].r; i++) tag[i] = 1;
}

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            a[i][j] = read();
    for(int i = 1; i <= m; i++) bfs(1, i, i);
    for(int i = 1; i <= m; i++)
        if(!tag[i])
        {
            cout << 0 << endl;
            for(int j = 1; j <= m; j++)
                if(!tag[j]) ans++;
            cout << ans;
            return 0;
        }
    cout << 1 << endl;
    int l = 1;
    while(l <= m)
    {
        int r = 0;
        for(int i = 1; i <= m; i++)
            if(e[i].l <= l) r = max(r, e[i].r);
        ans++, l = r + 1;
    }
    cout << ans;
    return 0;
}

おすすめ

転載: www.cnblogs.com/BigYellowDog/p/11346531.html