サマーキャンプ2q10

チェンサンのキューブ

ここに写真の説明を挿入
高さ2階、幅2階、長さ2階を見つけました。焼けたに違いないので、2を超える特別な判断はありません。上記の式は2を超えています。

#include<bits/stdc++.h>
using namespace std;
inline long long read()
{
    
    
    long long f=1,res=0;char ch=getchar();
    while(!isdigit(ch)){
    
    if(ch=='-')f=-f;ch=getchar();}
    while(isdigit(ch)){
    
    res=(res<<1)+(res<<3)+(ch&15);ch=getchar();}
    return res*f;
}
long long  n,m,k;
int main()
{
    
    
    n=read();m=read();k=read();
    unsigned long long ans=(n-2)*(m-2)*(k-2);
    cout<<ans;
    return 0;
}
   


陳泰陽の公式

ここに写真の説明を挿入
ここでは、2つの方法を示します
。1。可能な値をそれぞれ計算するためのテーブルを作成します
。2。検索とスタックのシミュレーション、すべての可能性を計算した後、答えをシミュレートします

#include<bits/stdc++.h>
using namespace std;
long long tot=0x7fffffff;
long double  ans[100], a,b,c,d,jsq=1;
char aa[5]={
    
    ' ','+','-','*','/'};
int main()
{
    
    
	cin>>a>>b>>c>>d;
	/*for(int i=1;i<=4;i++)
	for(int j=1;j<=4;j++)
	for(int k=1;k<=4;k++)
	{
		cout<<"ans["<<jsq<<"]="<<'a'<<aa[i]<<'b'<<aa[j]<<'c'<<aa[k]<<'d'<<";"<<endl;
		jsq++;
	}*/
ans[1]=a+b+c+d;
ans[2]=a+b+c-d;
ans[3]=a+b+c*d;
ans[4]=a+b+c/d;
ans[5]=a+b-c+d;
ans[6]=a+b-c-d;
ans[7]=a+b-c*d;
ans[8]=a+b-c/d;
ans[9]=a+b*c+d;
ans[10]=a+b*c-d;
ans[11]=a+b*c*d;
ans[12]=a+b*c/d;
ans[13]=a+b/c+d;
ans[14]=a+b/c-d;
ans[15]=a+b/c*d;
ans[16]=a+b/c/d;
ans[17]=a-b+c+d;
ans[18]=a-b+c-d;
ans[19]=a-b+c*d;
ans[20]=a-b+c/d;
ans[21]=a-b-c+d;
ans[22]=a-b-c-d;
ans[23]=a-b-c*d;
ans[24]=a-b-c/d;
ans[25]=a-b*c+d;
ans[26]=a-b*c-d;
ans[27]=a-b*c*d;
ans[28]=a-b*c/d;
ans[29]=a-b/c+d;
ans[30]=a-b/c-d;
ans[31]=a-b/c*d;
ans[32]=a-b/c/d;
ans[33]=a*b+c+d;
ans[34]=a*b+c-d;
ans[35]=a*b+c*d;
ans[36]=a*b+c/d;
ans[37]=a*b-c+d;
ans[38]=a*b-c-d;
ans[39]=a*b-c*d;
ans[40]=a*b-c/d;
ans[41]=a*b*c+d;
ans[42]=a*b*c-d;
ans[43]=a*b*c*d;
ans[44]=a*b*c/d;
ans[45]=a*b/c+d;
ans[46]=a*b/c-d;
ans[47]=a*b/c*d;
ans[48]=a*b/c/d;
ans[49]=a/b+c+d;
ans[50]=a/b+c-d;
ans[51]=a/b+c*d;
ans[52]=a/b+c/d;
ans[53]=a/b-c+d;
ans[54]=a/b-c-d;
ans[55]=a/b-c*d;
ans[56]=a/b-c/d;
ans[57]=a/b*c+d;
ans[58]=a/b*c-d;
ans[59]=a/b*c*d;
ans[60]=a/b*c/d;
ans[61]=a/b/c+d;
ans[62]=a/b/c-d;
ans[63]=a/b/c*d;
ans[64]=a/b/c/d;
for(int i=1;i<=64;i++)if(ans[i]==(int)ans[i])tot=min(abs((long long)ans[i]),tot);//,cout<<abs(ans[i])<<' ';
cout<<tot;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int fh[5],s[5];
int a,b,c,d,ans=0x7fffffff;
inline void get_ans()
{
    
    
    double sz[5],h[5];
    int tep=0,top=0;
    sz[++tep]=s[1];
     
    /*for(int i=1;i<=3;i++)cout<<fh[i]<<' ';
    cout<<endl;*/
    for(int i=1;i<=3;i++)
    {
    
    
      if(fh[i]==1||fh[i]==2)h[++top]=fh[i],sz[++tep]=s[i+1];
      if(fh[i]==3)sz[tep]=sz[tep]*1.0*s[i+1];
      if(fh[i]==4)sz[tep]=sz[tep]*1.0/s[i+1];
    }
    while(top)
    {
    
    
       if(h[top]==1)
       {
    
    
        sz[tep-1]+=sz[tep];
        tep--;
       }
       else
       {
    
    
        sz[tep-1]-=sz[tep];
        tep--;
       }
       top--;
    }
//  cout<<sz[1]<<' ';
    if(sz[1]==(int)sz[1])ans=min(ans,abs((int)sz[1]));
}
inline void dfs(int x)
{
    
    
    if(x==4)
    {
    
    
        get_ans();
        return;
    }
    for(int i=1;i<=4;i++)
    {
    
    
        fh[x]=i;
        dfs(x+1);
    }
}
int main()
{
    
    
    cin>>s[1]>>s[2]>>s[3]>>s[4];
    dfs(1);
    cout<<ans;
    return 0;
}


陳太陽とファンここに写真の説明を挿入

この質問でどの種類のアクセスシーケンスを選択しても、最終的なメリットは同じであることに注意してください。次に、任意の順序を選択して、答えを数えます。時間の複雑さはO(n)です。
証明:
誘導を使用します。
n = 1の場合、明らかに答えは順序とは関係ありません。ここで、サイズ<nのツリーの答えが順序とは関係がないとします。サイズ= nのツリーの答えが順序とは関係がないことを証明しましょう。
ANS(x)を使用して、ルート、ルートの息子x、およびxのサブツリーのみを持つサブ質問への回答、つまり、ルートから開始してルートに戻った後のxのサブツリーへの回答を表します。
SZ(x)を使用して、xをルートとするサブツリーの2倍のサイズ(つまり、xのサブツリーをルートからルートに戻るまでの日数)を表します。
ルートの息子を訪問する順序がs1、s2 ... smであると仮定すると、合計の答えはANS(s1)+ SZ(s1)(SZ(s2)+ SZ(s3)... + SZ(sm))+ ANSになります。 (s2)+ SZ(s2)(SZ(s3)+ SZ(s4)+ ... SZ(sm))+ ... + ANS(sm)。
合計の答えは、すべての息子のANSの合計に、2人の息子間のSZの積の合計を加えたものであることに注意してください。少なくとも2人の息子がいるため、息子のサブツリーのサイズはn未満である必要があります。誘導により、それらのANSは順序とは関係がないことがわかります。2人の息子の間のSZの積の合計も順序とは無関係です。したがって、size = nツリーの合計の答えは、順序とは関係ありません。

#include<bits/stdc++.h>
#define maxn 100010
using namespace std;
int head[maxn],tot;
struct node
{
    
    
    int u;
    int v;
}edge[maxn];
void add(int x,int y)
{
    
    
    edge[++tot].u=head[x];
    edge[tot].v=y;
    head[x]=tot;
}
long long ans,tep;
int n,m;
void dfs(int x,int fa)
{
    
    
 
    for(int i=head[x];i;i=edge[i].u)
    {
    
    
        int to=edge[i].v;
        if(to!=fa)
        {
    
    
            tep++;
            dfs(to,x);
            tep++;
        }
    }
    ans+=tep;
}
int main()
{
    
    
    cin>>n;
    for(int i=1;i<n;i++)
    {
    
    
        int x,y;cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    dfs(1,0);
    cout<<ans;
    return 0; 
}


ローストの最長のプレフィックス

生物学では、いくつかの生物の構造は、その要素を含む一連の大文字で表されます。生物学者は、長いシーケンスを短いシーケンス(つまり要素)に分解することに関心があります。セットPの要素を連結して(要素を再利用でき、順序を考慮する必要がない)シーケンスSを形成できれば、シーケンスSをPの要素に分解できると考えられます。要素はすべてに表示される必要はありません(BBCは以下の例には表示されません)。たとえば、シーケンスABABACABAABは、次のセットの要素に分解できます。{A、AB、BA、CA、BBC}シーケンスSの最初のK文字が特定のセットの要素で構成できる場合、これらのKと言います。文字は、シーケンスSの長さKのプレフィックスです。プログラムを設計し、要素のセットと大文字のシーケンスSを入力し、S 'をシーケンスSの最長のプレフィックスとし、指定されたセットPの要素に分解できるようにし、S'の長さKを見つけます。
dp [i]の最初のi文字を綴ることができるかどうかを表現して状態を設定し、要素のセットを列挙して、この要素を接続できるかどうかを判断します。接続できる場合は、転送を検討します。

#include<bits/stdc++.h>
using namespace std;
bool  dp[200010];
string s[250],n="",s2;
int k=1,ans;
int main()
{
    
    
    while(cin>>s[k])
    {
    
    
        if(s[k]==".")break;
        k++;
    }
    while(cin>>s2)n=n+s2;
 
     
    dp[0]=1;
    for(int i=1;i<=n.size();i++)
    {
    
    
        for(int j=1;j<=k;j++)
        {
    
    
            int len=s[j].size();
            if(i-len<0)continue;
            /*string ss=n.substr(0,i-len);
            if(ss+s[j]==n.substr(0,i)&&dp[i-len])
            {
                dp[i]=1;
                ans=i;
                break;
            }*/
            int v=len-1,u=i-1;
            while(v>=0)//比较可不可以接上去
            {
    
    
                if(n[u]==s[j][v])v--,u--;
                else break;
            }
            if(v<0&&dp[i-len])
            {
    
    
                             
                dp[i]=1;//标记为可以
                ans=i;
                break;
            }
        }
    }
    cout<<ans;
    return 0;
}

おすすめ

転載: blog.csdn.net/yhhy666/article/details/108277182