冗長的代碼(枚舉解法)
#include<bits/stdc++.h>using namespace std;void solve()
{int n;cin>>n;if(n==1||n==3||n==6||n==10||n==15){cout<<1<<endl;return;}int cnt=0;if(n>=100){int temp=n/15;if(temp>=6){n-=(temp-6)*15;cnt+=temp-6;}}while(n){while(n>=30){n-=15;cnt++;}if(n==29){n-=29;cnt+=4;}if(n==28){n-=28;cnt+=3;}if(n==27){n-=27;cnt+=3;}if(n==26){n-=26;cnt+=3;}if(n==25){n-=25;cnt+=2;}if(n==24){n-=24;cnt+=3;}if(n==23){n-=23;cnt+=3;}if(n==22){n-=22;cnt+=3;}if(n==21){n-=21;cnt+=2;}if(n==20){n-=20;cnt+=2;}if(n==19){n-=19;cnt+=3;}while(n>=18){n-=18;cnt+=2;}if(n==17){n-=17;cnt+=3;}if(n==16){n-=16;cnt+=2;}while(n>=15){n-=15;cnt+=1;}while(n>=14){n-=14;cnt+=3;}if(n==13){n-=13;cnt+=2;}while(n>=12){n-=12;cnt+=2;}if(n==11){n-=11;cnt+=2;}while(n>=10){n-=10;cnt++;}if(n==9){n-=9;cnt+=2;}if(n==8){n-=8;cnt+=3;}if(n==7){n-=7;cnt+=2;}while(n>=6){n-=6;cnt++;}if(n==5){n-=5;cnt+=3;}if(n==4){n-=4;cnt+=2;}while(n>=3){n-=3;cnt++;}if(n==2){n-=2;cnt+=2;}while(n>=1){n-=1;cnt++;}}cout<<cnt<<endl;
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin>>t;while(t--)solve();return 0;
}
其實可以把這些情況存到數組里面直接輸出就好了,但是我比賽的時候先是寫了一下條件判斷,然后加了一些條件判斷,最后索性全部條件判斷了
#include<bits/stdc++.h>using namespace std;int a[100]={0,1,2,1,2,3,1,2,3,2,1,2,2,2,3,1,2,3,2,3,2,2,3,3,3,2,3,3,3,4,2};void solve()
{int n;cin>>n;if(n<=30)cout<<a[n]<<endl;else{int ans=0;if(n>=100){int temp=n-100;int temp2=temp/15;int temp3=15*temp2;ans+=temp2;n-=temp3;}while(n>=30){n-=15;ans++;}ans+=a[n];cout<<ans<<endl;}
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin>>t;while(t--)solve();return 0;
}
不管怎么優化,還是太笨了,這個做法,而且具有一定的風險
枚舉每一次數字的答案的時候,可能枚舉錯誤
但總歸是可以過的,夸夸自己
找規律解法
#include<bits/stdc++.h>using namespace std;void solve()
{int n;cin>>n;int ans=1e9;for(int one=0;one<=2;one++)for(int three=0;three<=1;three++)for(int six=0;six<=4;six++)for(int ten=0;ten<=2;ten++){int temp=1*one+3*three+6*six+10*ten;int temp2=n-temp;if(temp<=n&&temp2%15==0)ans=min(ans,one+three+six+ten+temp2/15);}cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin>>t;while(t--)solve();return 0;
}
上面這種解法表示的是,1 最多只可以使用 2 次,3 最多只可以使用 1 次,6 最多只可以使用 4 次,10 最多只可以使用 2 次
很簡單,假設只用 3 次 1 ,為什么不直接用 3
假設用 2 次 3 為什么不直接用 6
假設用 5 次 6 為什么不直接用 2 個 15
假設用 3 個 10 為什么不直接用 2 個 15
也就是說,有點找最小公倍數的感覺,算是一個數學做法,枚舉暴力求解就行,需要注意的是,條件判斷要保證枚舉的答案在范圍內,少加一個判斷條件會發生部分錯誤
還有一些 dp 的解法,我現在還是不管比較好