エクササイズマシンの第2週の「プログラミング言語統合デザイン」

5最長共通部分

二つの文字列が与えられ、B、文字の文字列におけるk前のチャンスを変更するので、最長共通部分は、二つの最も長い文字列を変更していること。それぞれの変更は、文字列B内の任意の位置に任意の文字列を変更し、選択することができます。

入力形式

最初の行は、正の整数kを含みます。
2行目と3行目、それぞれの入力文字列A、B。(各文字列の長さは500を超えません)

出力フォーマット

出力は、修正二つの文字列の最長共通部分の長さを表す整数です。

サンプル入力

5
AAAAA
BBBBB

サンプル出力

5

容認されました

文字列の2つの最長共通部分文字列を取得し、サブは、元の文字列に連続している必要。そして、最長共通部分列は連続する必要はありません。



#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
using namespace std;
int calculate(string a,string b,int k){ //计算字符串开头开始最长的公共子串
    int pos=0; //已访问位置
    int K=0;//差异
    while(pos<a.size()&&pos<b.size()&&(a[pos]==b[pos]||K<k)){
        if(a[pos]!=b[pos]) K++;
        pos++;
    }
    return pos;
}
        int main(){
            int k;
            int lena,lenb;
            int max=0;
            int i,j;
            int ans=0;
            string a,b;
            cin >>k;
            cin >> a >> b;
            lena=(int)a.size();
            lenb=(int)b.size();
            for(i=0;i<lena;i++){
                for(j=0;j<lenb;j++){
                    max=calculate(a.substr(i),b.substr(j),k); //substr :主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。
                    if(ans<max) ans=max;
                }
            }
            cout << ans << endl;
            return 0;
        }

6つの回転ダイス

マーサが有するNダイス、各ダイス面6が正確に0と9の間の数であり、金型面6の同じ番号を繰り返さないであろう。
今、マーサは、新しいデジタルスクリーンを作成するために、n個を使用します。表示し、新しい番号を取得するために、ダイの上面を読み取るように左から右に彼女Nダイスは、その後、一列に配置されています。それから彼女は新しいとは異なる番号を取得することができ、各サイコロの回転面を続けました。ダイスは、以下の規則満たしている必要があり、回転;新しい番号を作成する際に、必要なすべてのダイスを使用しない2; 1を、生成数は先行ゼロを含めることはできません3、ロータリーダイを使用して、デジタル数字9 6に変換、およびその逆はできません。
n個のサイコロを考えると、マーサは、xに1からすべての整数を構成し、それらを使用することができます。マーサは、n与えられたサイコロのために、xの最大値がどのくらいある、知りたいですか?

入力形式

nは整数でのみ最初の行数(1≤n≤3)ダイス。
次のn行、各ライン6含む整数[I] [J]( 0≦A [i] [j]は≤9)、 j番目の面番号は、i番目のダイスを表します。

出力フォーマット

整数、すなわちxの最大数出力は、マーサは、1からXまで彼女のダイス設定番号を使用することができます。あなたは1を構成することができない場合、出力は0です。

サンプル入力

3
0 1 3 5 6 8
1 2 4 5 7 8
2 3 4 5 6 7 9

サンプル出力

98

容認されました

#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
using namespace std;
        int main(){
            int n;
            int i,j,k,t;
            int a[500][500];
            cin >> n;
            for(i=1;i<=n;i++){
                for(j=1;j<=6;j++)
                    cin >> a[i][j];
            }
           //n==1
            if(n==1){
                for(j=1,k=1;j<=6;j++){
                    if(a[1][j]==k) k++;
                }
                k--;
                cout << k << endl;
                return 0;
            }
            //n==2
           if(n==2){
               for(j=1,k=1;j<=6;j++){
                   for(t=1;t<=6;t++)
                   if(a[1][t]==k||a[2][t]==k) k++;
               }
               k--;
               if(k<9){cout << k << endl;return 0;}
               else{
                   for(k=10,j=1;j<=35;j++){
                       for(i=1;i<=6;i++){
                           for(t=1;t<=6;t++)
                           if(a[1][i]*10+a[2][t]==k||a[1][i]+a[2][t]*10==k) k++;
                       }
                   }
                   k--;
                   cout << k << endl;return 0;
               }
           }
            
            if(n==3){
                for(j=1,k=1;j<=6;j++){
                    for(t=1;t<=6;t++)
                    if(a[1][t]==k||a[2][t]==k||a[3][t]==k) k++;
                }
                k--;
                if(k<9){cout << k << endl;return 0;}
                else{
                    for(k=10,j=1;j<=35;j++){
                        for(i=1;i<=6;i++){
                            for(t=1;t<=6;t++) if(a[1][i]*10+a[2][t]==k||a[1][t]+a[2][i]*10==k||a[1][i]*10+a[3][t]==k||a[1][t]+a[3][i]*10==k||a[2][i]*10+a[3][t]==k||a[2][t]+a[3][i]*10==k) k++;
                    
                       }
                    }
                    k--;
                    cout << k << endl;return 0;
                }
            }
            return 0;
        }

7均等ペン

N個の個別の円、それぞれが持っているペンを愛。一人一人が、周りの隣の人にエネルギーが一人1あたりのペンを渡すことによって消費されるたびにペンを渡すことができます。すべての個人にペン最小エネルギーの等しい数を与えることを求めて。

入力形式

最初の行の整数nは、数(データの30%、N <= 1000; 100%のデータ、N <= 1E6)人。
次のn行、整数aiを各行。

出力フォーマット

出力アンペンへのすべての最小エネルギーの平等なアクセスを表す整数。(答えは、その64ビット符号付き整数ストアを確実にするために使用することができます)

サンプル入力

4
1
2
5
4

サンプル出力

4

容認されました

参考資料:キャンディパス
それぞれの人のために、変化の2種類を通過する彼の項目を想定して:1は、人から取ります。最終的な結果は、変更がAVERになっているの前に2人を与えます。

  • [1] -X1 + X2 = AVER X2 = X1-([1] -aver)
  • [2] -X2 + X3 = AVER X3 = X1-([2] + [1] -2 * AVER)
    に設けられC [1] = [1 ] -aver C [2] = C [1] + [2] -aver
    がC [I] = C [I -1] + [I] -aver
    ある問題| X1 | + | X2 | + ... + | Xnの| 、および各最小X1 | | + | X1- X1で表すことができる C [1] | + | X1-C [2] | + ... + | X1-C [N-1] |
    絶対的な意味も表すX i軸、距離を見つけて、自分の小さな点を試して、数直線上の与えられたn個の点が、ポイントは、これらの数字は中央値ということである:CIとの距離、問題になるので、
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
using namespace std;
int a[1000005]={0},x[1000005]={0};
        int main(){
            int n;
            long long sum=0,num=0;
            int i=0,j;
            int aver;
            cin >> n;
            for(i=0;i<n;i++){
                cin >> a[i];
                sum+=a[i];
            }
            aver=(int)(sum/n);
            for(i=0;i<n;i++){
                x[i]=x[i-1]-a[i-1]+aver;
            }
            sort(x,x+n);
            j=n/2;
            for(i=0;i<n;i++){
                num+=abs(x[j]-x[i]);
            }
            cout << num << endl;
            return 0;
        }

付録:数学的な証明

数直線上に存在するn個の点は、点x、距離と彼女その各点ので最小値を見つけます。証明:この数は、nの中央値は、その点で表されます。我々は、二つの中間点のそれぞれから最も近い点をポイントと最大最小フィーチャ、二番目に大きい小......回対にされる数直線上の2点を取る場合には、

ポイントの奇数がある場合、その後、明らかにそれがために要求されたポイントの真ん中。
∴数が中央値であり、nは証明されている点を示します。

おすすめ

転載: www.cnblogs.com/lvhang/p/12386018.html