NOI / 2.5基本算法之搜索7834:分成互质组(详细讲解)
總時間限制:?1000ms????????????????????????????????????????內存限制:?65536kB
描述
給定n個正整數,將它們分組,使得每組中任意兩個數互質。至少要分成多少個組?
輸入
第一行是一個正整數n。1 <= n <= 10。
第二行是n個不大于10000的正整數。
輸出
一個正整數,即最少需要的組數。
樣例輸入
6 14 20 33 117 143 175樣例輸出?
3來源
2008年第十三屆“華羅庚金杯”少年數學邀請賽 決賽第5題
查看? ? ? ? ??提交? ? ? ? ??統計? ? ? ? ??提問
———————————————————————————————————————————
開始講解
首先,觀察題目,要把輸入的幾個數分成幾組數,要求每一組數中任意兩個數互質,求最少需要分成幾組。
要判斷是否互質,我們需要定義一個計算最大公因數的遞歸調用函數,返回最大公因數,只需要判斷最大公因數是否是1就可以了(互質就表示最大公因數是1)。
int fun(int a,int b) {if(b==0)return a;elsereturn fun(b,a%b); }其中a,b表示需要判斷的兩個數(上面用的是輾轉相除法)。
然后繼續觀察題目,要求每組數中兩兩互質,怎么判斷兩兩互質呢,其實并不復雜,只需要用新數去與原來那組數所有數的乘積去判斷就可以了。
最后想法:首先遍歷每個數,判斷每個數是否用過(定義一個狀態數組),初值為0,表示沒有用過),如果沒有用過,組數加一,更改狀態數組的值(0改為1),從這個數的后面每個數開始遍歷,如果當前判斷的這個數沒有用過,且與一開始的數互質,把這個數乘到原來的數里面去(a[i]*=a[j]),把后來的數表示用過。最后輸出組數的數量就行了。
最終代碼
#include<bits/stdc++.h> using namespace std; int fun(int a,int b) {if(b==0)//余數為0。return a;//返回除數。elsereturn fun(b,a%b);//返回除數和余數。 } int main() {int a[12],v[12]={0},i,j,t=0,n;cin>>n;for(i=1;i<=n;i++)cin>>a[i];//保存輸入的數。for(i=1;i<=n;i++)//遍歷a數組(此處需要循環到最后一個數,因為最后一個數如果是單獨一個\數的話,也要開新的一組,如果循環到n-1,就漏了一組。)。if(v[i]==0)//如果當前的數沒有用過。{t++;//新的一組。v[i]=1;//標記用過。for(j=i+1;j<=n;j++)//找到與他同一組的數if(v[j]==0&&fun(a[i],a[j])==1)//如果沒用過且與其他數互質。{a[i]*=a[j];//將同一組的乘積存入a[i]v[j]=1;//標記用過。}}cout<<t<<endl;//輸出一共有幾組數return 0; }創作不易,給個點贊、收藏、關注、支持支持唄。(*^▽^*)? ?(?ω?)
總結
以上是生活随笔為你收集整理的NOI / 2.5基本算法之搜索7834:分成互质组(详细讲解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: virtual析构函数的作用?
- 下一篇: 双目相机--双目视差与深度距离关系推导详