come oj 02 寶可夢中心大對決!(嘗試解法二,仍未能AC)

游戲通關(guān)了,把暑假?zèng)]有AC的pokemon再看了一遍。
能過師兄的數(shù)據(jù),但仍不能AC
思路二:
總體思路:記錄兩兩互質(zhì)所有狀況,記錄權(quán)重,用權(quán)重判斷數(shù)據(jù)的取舍。
(1)引入權(quán)重的概念,兩重循環(huán)遍歷數(shù)據(jù),判斷兩兩互質(zhì)的數(shù)量。并將權(quán)重記錄下來。
如:7 6 5 4 3 2 1中,7與其他任何一個(gè)數(shù)都互質(zhì),所以他的權(quán)重是6,而6與4 3 2 都不互質(zhì),所以權(quán)重為3.
(2)記錄7 6 5 4 3 2 1互質(zhì)的情況,如果7與6互質(zhì),就判定為1,并記錄,否則判定為0。(好像是狀態(tài)壓縮的概念,但我沒學(xué)過狀態(tài)壓縮)
(3)排序權(quán)重,將權(quán)重高的排在前面,權(quán)重低的排在后面,避免因?yàn)檫壿媶栴}反而把權(quán)重高的舍棄了。(比如,a權(quán)重為7,b權(quán)重為6,c權(quán)重為6, d權(quán)重為8,如果先判斷a,把b,c舍棄了,如果b,c和d是互質(zhì)的,b,c被舍棄后d權(quán)重會(huì)下降變成6,c就會(huì)被舍棄。)
(4)如果兩個(gè)數(shù)不互質(zhì),就通過權(quán)重比較舍棄數(shù)據(jù)
代碼如下:

#include<iostream>
using namespace std;

long long gcd(long long a, long long b) {
    return b ? gcd(b, a % b) : a;
}

void niubi(int n, long long a[20][20])
{
    long long i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            if (a[i][0] != 0 && a[j][0] != 0)
            {
                if (gcd(a[i][0], a[j][0]) == 1)//判斷兩個(gè)數(shù)是否互質(zhì),如果互質(zhì)
                {
                    a[i+1][j+1] = 1;
                }
                else
                {
                    a[i+1][j+1] = 0;
                }
            }
        }
    }
}

int main()
{
    int T;
    int n;
    int i, j,k;
    int sum;
    long long temp;
    long long a[20][20] = {0};
    long long dp[20] = {0};
    int ins[20];
    //用二維數(shù)組記錄,第一個(gè)維度代表著輸入的數(shù)據(jù),第二個(gè)維度代表數(shù)據(jù)互質(zhì)狀況,第二個(gè)維度末尾的一位代表著權(quán)重,
    //互質(zhì)為1,不互質(zhì)為0,數(shù)據(jù)加起來的總和即為權(quán)重
    cin >> T;
    
        while (T--)
        {
            

            cin >> n;
            sum = 0;
            memset(a, 0, sizeof(a));
            for (j = 0; j < n; j++)
            {
                cin >> a[j][0];//在第0位輸入對應(yīng)的數(shù)據(jù)
                a[0][j] = a[j][0];
            }

            for (j = 0; j <= n; j++)
                ins[j] = j;//初始化對應(yīng)坐標(biāo)

            niubi(n, a);


            for (i = 1; i <= n; i++)//計(jì)算權(quán)重
                for (j = 1; j <= n; j++)
                {
                    a[j][n + 1] += a[i][j];
                    dp[j] = a[j][n + 1];
                }


            for (i = 1; i <= n; i++)//給權(quán)重坐標(biāo)排序
            {
                for (j = 1; j <= n; j++)
                {                   
                    if (dp[i] > dp[j])
                    {
                        temp = dp[i];
                        dp[i] = dp[j];
                        dp[j] = temp;

                        temp = ins[j];
                        ins[j] = ins[i];
                        ins[i] = temp;

                    }
                }                           
            }

            /*for (i = 1; i <= n; i++)
                cout <<"\t"<< a[0][i-1];
            cout << endl;*/

            /*for (i = 1; i <=n+1; i++)
            {
                cout<< a[i-1][0] <<'\t';
                for (j = 1; j <=n; j++)
                    cout << a[j][i] << '\t';
                cout << endl;
            }*/
            //在此之前要將權(quán)重高的排個(gè)序

            /*for (j = 0; j <= n; j++)
                cout << ins[j] << '\t';
            cout << endl<<endl;*/

            for (i = 1; i <= n; i++)
            {
                for (j = 1; j <= n; j++)
                {
                    //cout << a[ins[i]][j] << '\t';
                    if (a[ins[i]][j] == 0 && ins[i] != j&&a[ins[i]][n+1]!=0)
                    {
                        for (k = 1; k <= n + 1;k++) a[j][k]=0;
                    }
                    //cout << a[ins[i]][n + 1] << a[j][n+1] << endl << endl;
                }
                //cout << endl;
                
            }
            /*cout << endl;
            for (i = 1; i <= n; i++)
            {
                for (j = 1; j <= n; j++)
                {
                    cout << a[ins[i]][j] << '\t';
                }
                cout << endl;
            }*/
            for (j = 1; j <=n; j++)
                if (a[j][n+1] != 0) sum++;
            cout << sum << endl;
        }
    
    return 0;
}

運(yùn)行截圖:


image.png

師兄的數(shù)據(jù):


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 10,531評論 0 13
  • 高級鉗工應(yīng)知鑒定題庫(858題) ***單選題*** 1. 000003難易程度:較難知識范圍:相關(guān)4 01答案:...
    開源時(shí)代閱讀 6,306評論 1 9
  • 選擇題部分 1.(),只有在發(fā)生短路事故時(shí)或者在負(fù)荷電流較大時(shí),變流器中才會(huì)有足夠的二次電流作為繼電保護(hù)跳閘之用。...
    skystarwuwei閱讀 14,373評論 0 7
  • 選擇題部分 1.()部門負(fù)責(zé)日常監(jiān)督檢查工作,安全巡視的同時(shí)進(jìn)行消防檢查,推動(dòng)消防安全制度的貫徹落實(shí)。 A: 消防...
    skystarwuwei閱讀 15,943評論 0 3
  • 噢!醒來之后發(fā)現(xiàn)自己躺在古天樂旁邊,我揉了揉眼睛,手可以動(dòng),還可以捏臉,捏臉還很痛!啊,不是做夢呢!原來我昨天真的...
    元?dú)饣⑵へ埓笕?/span>閱讀 493評論 0 0

友情鏈接更多精彩內(nèi)容