起初看了好久没看懂,后来才知道什么意思,就是找一下规律,然后统计一下值。
有两个公式可以推出来。
#include <cstdio> using namespace std; const int N = 100010; int a[N]; /* 1 4 3 4 3 2 1 1 0.3 3 1 4 0.6 */ void solve(){ int n, m, pos = 0; scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++){ scanf("%d", &a[i]); if(a[i] != i) pos = i; } double ans = 1; double posbility; for(int i = 1; i <= m; i ++){ int value; scanf("%d%lf", &value, &posbility); if(value >= pos) ans *= (1 - posbility); } if(pos == 0) printf("1.000000\n"); else printf("%.6lf\n", 1 - ans); return; } //ans += (1 - ans) * p //这是另一个公式 int main(){ int t; scanf("%d", &t); while(t --){ solve(); } return 0; }