1. 程式人生 > >題解 CF939B 【Hamster Farm】

題解 CF939B 【Hamster Farm】

題目分析

實質上就是求餘數,找到n mod a[i] 的最小值,然後把 i 與 n/a[i] 輸出。就是一道純粹的模擬題,不過因為翻譯,要注意隱隱約約有10e18的資料範圍,一定要小心,用long long才行(一開始嚇得我想用高精(霧))。

主要思路

枚舉出每一個 a[i] 然後讓 n mod a[i] ,去找最小值。

程式碼實現

第一種方法:(有點像樓上dalao的)

PS:這個可以被優化為第二種方法

時間複雜度O(k),空間複雜度O(k);

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long    
//long long打起來有點費勁(偷懶
#define mn 100010
#define go(i,j,n,k) for(register ll i=j;i<=n;i+=k)//迴圈偷懶
inline ll read(){//讀入優化
    ll x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-f;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
const ll inf=9223372036854775807;//初始化最小值用的
ll n,k,a[mn],mi,mii;//n 倉鼠的總數 k 籠子種數 
//a[]記錄所有籠子可裝倉鼠的只數 mi 記錄最佳的籠子剩餘的只數
//mii 記錄最佳籠子的編號
int main(){
    n=read();k=read();
    go(i,1,k,1){
        a[i]=read();
    }//讀入
    mi=inf;//初始化最小值(最佳)
    go(i,1,k,1){
        if(n%a[i]<mi){//更新最佳籠子
            mii=i;
            mi=n%a[i];
        }
    }
    cout<<mii<<" "<<n/a[mii];//輸出最佳籠子編號與所需的籠子個數
    return 0;
}

第二種方法:(簡單的優化)

(理論)

時間複雜度:O(k) 空間複雜度:O(1);

重複的就不多講了,以下主要講優化

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
#define mn 100010
#define go(i,j,n,k) for(register ll i=j;i<=n;i+=k)
inline ll read(){
    ll x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-f;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
const ll inf=9223372036854775807;
ll n,k,a,m,mi,mii;//a 變為了單個的變數 m 記錄當前最佳籠子的a的值
int main(){
    n=read();k=read();
    mi=inf;
    go(i,1,k,1){//變為一個迴圈
        a=read();//讀入不變
        if(n%a<mi){//讀入後直接判斷
            mi=n%a;
            m=a;//記錄下來最佳(否則就會被覆蓋掉)
            mii=i;
        }
    }
    cout<<mii<<" "<<n/m;//n/m則為籠子個數
    return 0;
}

後記

不知為什麼優化後佔用記憶體還會這麼多,,,

第二次發題解請大佬多多指教,,,