---
# System prepended metadata

title: 'Pool Filling(UVA13242) '
tags: [CPE 二顆星]

---

# Pool Filling(UVA13242) 
## 題目
[點我](https://onlinejudge.org/external/132/13242.pdf)

## 解題網站
[UVA](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=878&page=show_problem&problem=5165)
ZJ上無此題

## 題意
有一個游泳池與n個罐子，每個罐子裡有水，水有溫度與體積，要把罐子的水(連續區段)倒入游泳池，倒入的水會加權影響溫度，給定最大容量與目標溫度，計算在符合限制條件下，與目標溫度差最小的連續區段為何？

## 複雜度分析
題目說共有t筆測資，每筆測資中，n(罐子的數量)<=3000，因此若每筆測資採用$O(n^2)$的演算法，計算量約為$t\times 3000^2=t\times 9\times 10^6$，大概不會TLE，因此採取$O(n^2)$的演算法

## 演算法
```
對於每筆測資
1. 輸入tC(maximum capacity), tT(target temperature)
2. 宣告minT=最大值(最小溫度差), ansI, ansJ，並輸入n
3. 把n個罐子的體積與溫度輸入到vector v中
4. for (int i = 0; i < n; i++) // i代表起始罐子的編號
    3.1. 宣告c([i,j]的體積)=0, t=0([i,j]的加權溫度)
    3.2. for (int j = i; j < n; j++) // j代表終點罐子的編號
        3.2.1. c += v[i].體積
        3.2.2. t += v[i].溫度 * v[i].體積
        3.2.3. 如果 (c >= tC / 2) and (c <= tC) and (abs(t / c - tT) <= 5) and (abs(t / c - tT) < minV)，則更新minT, ansI, ansJ
5. 輸出ansI, ansJ
```

## 程式碼
```cpp=
#include <bits/stdc++.h>
#define int long long int
#define C first
#define T second
using namespace std;

signed main() {
    int cas;
    cin >> cas;
    while (cas--) {
        double tC, tT;
        cin >> tC >> tT;
        
        double minT = DBL_MAX, ansI, ansJ;
        int n;
        cin >> n;

        vector <pair <double, double>> v(n);
        for (int i = 0; i < n; i++) {
            cin >> v[i].C >> v[i].T;
        }

        for (int i = 0; i < n; i++) {
            double c = 0, t = 0;
            for (int j = i; j < n; j++) {
                c += v[j].C;
                t += v[j].T * v[j].C;
                if (c >= tC / 2 and c <= tC and abs(t / c - tT) <= 5 and abs(t / c - tT) < minT) {
                    minT = abs(t / c - tT);
                    ansI = i;
                    ansJ = j;
                }
            }
        }
        if (minT == DBL_MAX) {
            cout << "Not possible" << endl;
        } else {
            cout << ansI << " " << ansJ << endl;
        }
    }
    return 0;
}
```
