a.連接:https://codingcompetitions.withgoogle.com/kickstart/round/0000000000050e01/00000000000698d6ios
題意:有n個學生,要從裏面選出p個來。每個學生都有一個能力值。數組
要求你選出來的一組學生能力是相同的,有的學生能力比較低,因此須要花費你的時間來提高學生能力,一個學生提高1個能力值須要1小時。ide
求最低花費。google
方法:由於只能提升學生的能力值,不能下降,因此必定是選擇能力值挨着的那些。將數組排序,而後計算前p個花費,再將窗口日後移動...分別計算。spa
#include <iostream> #include <climits> #include <algorithm> #include <vector> using namespace std; static auto x = [](){ std::ios::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); }; int main(){ int t,n,p; cin>>t; int tmp=0; int ii=0; while(ii<t){ cin>>n>>p; vector<int> si; for(int i=0;i<n;i++){ cin>>tmp; si.push_back(tmp); } if(p==1){ cout<<"Case #"<<++ii<<": "<<0<<endl; continue; } sort(si.begin(),si.end()); int last=0; int minn=INT_MAX; for(int i=0;(i+p-1)<n;i++){ if(i==0){ for(int j=0;j<p;j++){ last += si[p-1]-si[j]; } }else{ last-=si[i+p-2]-si[i-1]; last+=(si[i+p-1]-si[i+p-2])*(p-1); } minn=min(minn,last); } cout<<"Case #"<<++ii<<": "<<minn<<endl; } return 0; }
b. https://codingcompetitions.withgoogle.com/kickstart/round/0000000000050e01/000000000006987dcode
沒作出來啊,真是菜的不行....連題解都看不懂!!!blog
題意:r*c的方格,其中1表示郵局,0表示空地。每一個空地都有個最短運輸時間x(是全部的1到這個點的曼哈頓距離中最小的),總運輸時間是每一個空地最短運輸時間最大的那個。讓你添加一個郵局,求最小的總運輸時間。(應該是這個意思吧。。。)排序
代碼錯誤,只是暫時記錄。ci
#include <iostream> #include <climits> #include <algorithm> #include <vector> using namespace std; static auto x = [](){ std::ios::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); }; typedef struct locaa{ int x,y; } loca; int main(){ int t,r,c; cin>>t; int ii=0; char charr='0'; while(ii<t){ vector<loca> yi,ling; vector<int> lingdis; cin>>r>>c; for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ cin>>charr; if(charr=='0'){ ling.push_back({i,j}); lingdis.push_back(INT_MAX); }else{ yi.push_back({i,j}); } } } if(ling.size()==0){ cout<<"Case #"<<++ii<<": "<<0<<endl; continue; } if(ling.size()==r*c){ int midx,midy; if(r%2==1){ midx=(r+1)/2; }else{ midx=r/2; } if(c%2==1){ midy=(c+1)/2; }else{ midy=c/2; } int mhd=r-midx+c-midy; cout<<"Case #"<<++ii<<": "<<mhd<<endl; continue; } int maxx=INT_MIN; int x,y; for(int i=0;i<ling.size();i++){ int minn=INT_MAX; for(int j=0;j<yi.size();j++){ int dis=abs(ling[i].x-yi[j].x)+abs(ling[i].y-yi[j].y); minn=min(dis,minn); } lingdis[i]=minn; if(minn>maxx){ maxx=minn; x=ling[i].x; y=ling[i].y; } } yi.push_back({x,y}); int res=INT_MIN; for(int i=0;i<ling.size();i++){ lingdis[i]=min(lingdis[i],abs(ling[i].x-x)+abs(ling[i].y-y)); res=max(res,lingdis[i]); } cout<<"Case #"<<++ii<<": "<<res<<endl; } return 0; } /* 3 3 3 101 000 101 1 2 11 5 5 10001 00000 00000 00000 10001 */