#include #include #include #include #include #include #include #include #include #include using namespace std; int dfs(vector>& memo, vector& n, vector& k, int t, int x){ if(t==1000) return 0; if(memo[t][x] != 1e9) return memo[t][x]; bool win = false; if(n[t] <= k[t]) win = true; else if((n[t]-1) % (k[t]+1) != 0) win = true; int ret = dfs(memo, n,k, t+1, x) + (x==0?-1:+1); //lose if(win){ int next = dfs(memo, n,k, t+1, x^1) + (x==0?+1:-1); //win if(x == 0){ ret = max(ret, next); }else{ ret = min(ret, next); } } return memo[t][x] = ret; } int main(){ int x = 1000; vector n(x), k(x); vector> memo(x+1, vector(2,1e9)); for(int i=0; i> n[i] >> k[i]; } int ans = dfs(memo, n,k, 0,0)/2 + 500; cout << ans << endl; return 0; }