Codeforces毎日の練習735D + 573B + 374C

735D税金

ポータルは、
ポータルミラーリング
いくつかのトピック(1600)
氏Funt収入は、彼らは有料(DD動作)に必要な彼の税を軽減するために、nはk個の部品(各収入> 1)に収入を置きたい、個々の支払い税。その最大の要因に給与税に必要な各収入について(それが素数であれば、ない自分のために1です)。氏Funtヘルプが支払われ、彼の税金を最小限に抑えます。
nが素数である場合、最初にかかわらず缶の、1は最小限でなければなりません。
偶数の場合、結果はより大きくなければならない、または2に等しく、2つの素数2 2つのつよりも大きいに分かれ、2であり、ゴールドバッハの予想によれば、2以上の偶数以上のいずれかを書き込むことができ、2つの素数、その後も解答それは2です。
奇数の場合は奇数の場合、偶数奇数の一つに分割され、さらには2以下(ケース2が1である)、及び点として素数素数の機能を調べる必要があり、奇数の答えは、3以下であること-2その後、素数、他のケース最小2、3を取る
(ツリー上の追加的な知識~~

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);
#define maxn 5005
#define inf 1000000002
#define for_(i,n) for(ll (i)=1;(i)<=(n);i++)
#define mod 80112002
int n,m;
int is_prome(int n){
    for (int i = 2; i <=sqrt(n) ; ++i) {
        if(n%i==0)return 0;
    }
    return 1;
}
int main(){
    IOS
    cin>>n;
    if(is_prome(n)){cout<<1;return 0;}
    if(n%2==0)cout<<2;
    else{
        if(is_prome(n-2))cout<<2;
        else cout<<3;
    }
    return 0;
}

573Bクマとブロック

ポータルは、
ポータルミラーリング
本当に強制(DPの水問題を
1800
クマあり、彼はライン塔を積み重ね、各タワーは、対応する高さを持っているリマク、各リマクはすべて完全にレンガに囲まれてすることはできませんどのように多くの時間を求めて、破壊されましたすべての塔(!TMクマ力(面白い))を破壊するために
示したように、完全に、それに囲まれているもの:
ここに画像を挿入説明
(黒い部分が完全にレンガに囲まれなければならない)
質問の意味、我々はすぐにいくつかのルールを取得することができます:
1,1破壊するために最初のラウンドの高さ
2は、i番目の塔H [i]のホイール(最上層の煉瓦の各ブロックは、円柱が破壊される)まで生存
3、左から右へ掃引、第左右共感にI + 1〜I-塔に塔まで、より生存よりも、
今良い書き込む方程式を転送する、オープン2つのメモリアレイは、右及び右から左(ルールに左から格納されている3 )は、2列に車輪を生き残る各タワーは、最小位置であり、最終的に最大値をとるために、各タワー十分介して、各塔いくつかのラウンドを生き残りました。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);
#define maxn 100005
#define inf 1000000002
#define for_(i,n) for(ll (i)=1;(i)<=(n);i++)
#define mod 80112002
int n;
int h[maxn],l[maxn],r[maxn];
int main(){
    IOS
    cin>>n;
    for_(i,n)cin>>h[i];
    l[1]=r[n]=1;
    for_(i,n){
        if(i==1)continue;
        if(h[i]==1){
            l[i]=1;
        }else{
            l[i]=l[i-1]+1;
        }
        l[i]=min(l[i],h[i]);
    }
    for (int j = n-1; j >=1 ; --j) {
        if(h[j]==1)r[j]=1;
        else r[j]=r[j+1]+1;
        r[j]=min(r[j],h[j]);
    }
    int ans=-1;
    for_(i,n){
        //cout<<l[i]<<" "<<r[i]<<endl;
        ans=max(ans,min(l[i],r[i]));
    }
    cout<<ans;
    return 0;
}

374Cインナとディマ

ちょうどこの質問犬にこちらをクリックして
、正確にミラー犬にここでのポイント
DFS + DP(2000)
インナディマとnを買う* m個のテーブル、グリッドのそれぞれはD、I、M、A中に書かれていますイナは、Dから順DIMADI ......「DIMA」のあまり、そうでない場合は1、出力として、完全な後に起動したいので、手紙、インナは特に、ディマを愛して「悪いディマ!」、あなたはすべての道を行くことができれば(プレゼンスループ)、「悪いインナは!」を出力し、どこへ行くの出力までのそれ以外の数。
プルーニングを追加し、その後同様に、現在のノードのオープンDP最長経路長を維持するために、目盛の端にあっても、正当な方法の組み合わせを処理するが、DFSのそれぞれからD Tを開始する前によく、次のDPノードが更新できるかどうかは次のノードにDFS。すべての最終テイク4の最大値は、分割することができます。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);
#define maxn 1005
#define inf 1000000002
#define for_(i,n) for(ll (i)=1;(i)<=(n);i++)
#define mod 80112002
int dir[4]={1,-1,0,0},dir2[4]={0,0,1,-1};
int n,m;
struct node{
    int x,y;
};
node cc[maxn*maxn];
vector<int> g[maxn*maxn];
int d[maxn*maxn],num[maxn][maxn],vis[maxn*maxn],dp[maxn*maxn];
char s[maxn][maxn];
void link(int v){
    int x=cc[v].x,y=cc[v].y;
    for (int i = 0; i <4 ; ++i) {
        if(x+dir[i]<1||x+dir[i]>n||y+dir2[i]<1||y+dir2[i]>m)continue;
        int u=num[x+dir[i]][y+dir2[i]];
        if(s[x][y]=='D'&&s[x+dir[i]][y+dir2[i]]=='I'){g[v].push_back(u);d[u]++;}
        if(s[x][y]=='I'&&s[x+dir[i]][y+dir2[i]]=='M'){g[v].push_back(u);d[u]++;}
        if(s[x][y]=='M'&&s[x+dir[i]][y+dir2[i]]=='A'){g[v].push_back(u);d[u]++;}
        if(s[x][y]=='A'&&s[x+dir[i]][y+dir2[i]]=='D'){g[v].push_back(u);d[u]++;}
    }
}
void dfs(int x){
    vis[x]=1;
    for (auto i:g[x]){
        if(vis[i]&&s[cc[i].x][cc[i].y]=='D'){
            cout<<"Poor Inna!";
            exit(0);
        }
        if(dp[i]<dp[x]+1){
            dp[i]=max(dp[i],dp[x]+1);
            dfs(i);
        }
    }
    vis[x]=0;
}
int main(){
    IOS
    cin>>n>>m;
    for_(i,n)cin>>(s[i]+1);
    int cnt=1;
    for_(i,n){
        for_(j,m){
            num[i][j]=cnt;
            cc[cnt].y=j;
            cc[cnt++].x=i;
        }
    }
    for_(i,cnt){link(i);}
    queue<int> q;
    for_(i,cnt){
        if(s[cc[i].x][cc[i].y]=='D'){dp[i]=1;q.push(i);}
    }
    while(!q.empty()){
        int x=q.front();
        q.pop();
        dfs(x);
    }
    int ans=0;
    for_(i,cnt){
        if(s[cc[i].x][cc[i].y]=='A')ans=max(ans,dp[i]);
    }
    if(ans==0){cout<<"Poor Dima!";return 0;}
    cout<<ans/4;
    return 0;
}
リリース元の4件の記事 ウォンの賞賛8 ビュー2822

おすすめ

転載: blog.csdn.net/qq_43682148/article/details/104971085