第八屆藍橋杯 9、分巧克力
阿新 • • 發佈:2018-12-07
標題: k倍區間
給定一個長度為N的數列,A1, A2, ... AN,如果其中一段連續的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍數,我們就稱這個區間[i, j]是K倍區間。
你能求出數列中總共有多少個K倍區間嗎?
輸入
-----
第一行包含兩個整數N和K。(1 <= N, K <= 100000)
以下N行每行包含一個整數Ai。(1 <= Ai <= 100000)
輸出
-----
輸出一個整數,代表K倍區間的數目。
例如,
輸入:
5 2
1
2
3
4
5
程式應該輸出:
6
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗 < 2000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
注意:
main函式需要返回0;
只使用ANSI C/ANSI C++ 標準;
不要呼叫依賴於編譯環境或作業系統的特殊函式。
所有依賴的函式必須明確地在原始檔中 #include <xxx>
不能通過工程設定而省略常用標頭檔案。
提交程式時,注意選擇所期望的語言型別和編譯器型別。
二分搜尋,但是我不會
#include<stdio.h> int n,k,h[100010],w[100010]; bool solve(int n) { int res=0,a,b,i; for(i=0;i<n;i++) { a=h[i]/n; b=w[i]/n; res+=a*b; } if(res>=k) return true; return false; } int main() { int i,low,high; while(scanf("%d%d",&n,&k)!=EOF) { low=1; high=100; for(i=0;i<n;i++) scanf("%d%d",&h[i],&w[i]); while(low<high-1) { int mid=(low+high)/2; if(!solve(mid)) high=mid; else low=mid; } printf("%d\n",low); } return 0; }