題解 CF939B 【Hamster Farm】
阿新 • • 發佈:2018-12-02
題目分析
實質上就是求餘數,找到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; }
後記
不知為什麼優化後佔用記憶體還會這麼多,,,
第二次發題解請大佬多多指教,,,