cf870c Maximum splitting 題解

先來說說題意。將一個數剖成一些合數,問最多能剖成多少個。

我們知道,最小的合數是4,所以貪心思路就是儘量多的get到4這個合數。
分析一下,顯然,如果這個數是4的倍數,直接除4;如果除4餘2,那麼不妨來思考一下,除以4之後剩下一個2,剛好可以和4湊一個6。
而對於除4餘1的情況,我們發現1+4+4=9是個合數,所以這裏需要兩個4才能湊出來,也就是a/4-1。對於除4餘3的情況,3+4+4+4=15是個合數。但是要注意,15=6+9也是可拆的,所以相當於-3個4又+了2,所以還是/4-1。
當然,對於某些數需要特判一下。

#include <iostream>
using namespace std;
int main(){
    long long q,n;
    cin>>q;
    while(q--){
        cin>>n;
        if(n<4||n==5||n==7||n==11){
            cout<<-1<<endl;
        }else if(n%4==0||n%4==2) {
            cout<<n/4<<endl;
        }else if(n%4==1||n%4==3){
            cout<<n/4-1<<endl;
        }
    }
    return 0;
}

果然今天不適宜模擬賽(

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章