本題很簡單,但是還是WA了幾次,主要原因是
1、變數初始化的位置要非常小心,何時需要在下一次迴圈重複記錄何時初始化,由於這個原因WA太可惜了
2、輸出保留三位小數的格式控制一定要注意
主要演算法思想如下
先求各個裝置最小頻寬中的最小值和最大頻寬中的最小值
然後遍曆最小頻寬到最大頻寬的區間,求最大比例,貪心搜尋最優方案
加速方案
設定標誌數組flag,只有輸入中間出現過的並且位於上下界區間中頻寬值才會考慮,節省搜尋時間,空間換時間
另外總結下查看資料類型表示範圍的方法,以int為例
1, 要看int 佔用多少位元組: sizeof(int)2, 要看int 佔用多少bits: sizeof(int) * 83, 要看int 所能表示的最大正整數: (unsigned int)(-1) / 2
輸出格式精度控制 %m.ns 及%m.nd舉例
第一個m表示輸出字串的長度,n表示從左邊數第n位開始對齊第二個m表示輸出十進位數的位元,n表示小數點後的位元比如24.1234如果以%5.2d輸出為24.12
Source Code
| Problem: 1018 |
|
User: yangliuACMer |
| Memory: 460K |
|
Time: 47MS |
| Language: C++ |
|
Result: Accepted |
#include <iostream>using namespace std;#define MAXN 32767//先求各個裝置最小頻寬中的最小值和最大頻寬中的最小值//然後遍曆最小頻寬到最大頻寬的區間,求最大比例,貪心搜尋最優方案int main(){int t,n,sump,maxb,minb,minp,i,j,k,low,high;int b[101][101],p[101][101],m[101],flag[MAXN];double best;cin>>t;while(t--){memset(flag, 0, sizeof(flag));cin>>n;low = high = MAXN;for(i = 0; i < n; i++){maxb = 0;minb = MAXN;//變數初始化的位置要非常小心,何時需要在下一次迴圈重複記錄何時初始化cin>>m[i];for(j = 0; j < m[i]; j++){cin>>b[i][j]>>p[i][j];flag[b[i][j]] = true;if(b[i][j] < minb) minb = b[i][j] ;if(b[i][j] > maxb) maxb = b[i][j] ;}if(low > minb)//各個裝置最小頻寬中的最小值low = minb;if(high > maxb)//各個裝置最大頻寬中的最小值high = maxb; }best = 0;for(k = low; k <= high; k++){if(flag[k]){//只有輸入中間出現過的並且位於上下界區間中頻寬值才會考慮,節省搜尋時間,空間換時間sump = 0;for(i = 0; i < n; i++){minp = MAXN;for(j = 0; j < m[i]; j++){if(b[i][j] >= k && p[i][j] < minp){minp = p[i][j];}}sump += minp;}if((double)k / (double)sump > best){best = (double)k / (double)sump;}}}printf("%.3lf\n",best);//保留3位小數}return 0;}