defsolve(): n,k = map(int, input().split()) ans = 0 dic = {} for _ inrange(n): x,y = map(int, input().split()) if x in dic: dic[x] += y else: dic[x] = y ls = sorted(dic.keys()) su = [dic[ls[0]]] for i inrange(1,len(ls)): su.append(su[-1]+dic[ls[i]]) for i inrange(len(ls)): tmp = ls[i]*k if tmp < su[i]: print("No") return print("Yes")
voidsolve(){ scanf("%d%lld", &n, &K); for (int i = 1; i <= n; i++) scanf("%d%d", &A[i].first, &A[i].second); // 订单按哪天交付排序 sort(A + 1, A + n + 1);
int last = 0; longlong have = 0; for (int i = 1; i <= n; i++) { // 计算增加的存货量 have += (A[i].first - last) * K; // 判断存货是否足够 if (have >= A[i].second) have -= A[i].second; else { printf("No\n"); return; } last = A[i].first; } printf("Yes\n"); }
intmain(){ int tcase; scanf("%d", &tcase); while (tcase--) solve(); return0; }
defsolve(): n,a,b = map(int, input().split()) print("Yes") ans = [] now = [[a,b] for _ inrange(4)] nx = [1,1,-1,-1] ny = [1,-1,-1,1]
le = 0 while le < n-1: for i inrange(4): xx,yy = now[i] x = xx + nx[i] y = yy + ny[i] if x < 1or x > n or y < 1or y > n: continue le += 1 ans.append((x,y,-le*nx[i],-le*ny[i])) now[i] = [x,y] if i == 0or i == 2: now[(i+1)%4] = [x,y-le*ny[i]] now[i-1] = [x-le*nx[i],y] else: now[(i + 1) % 4] = [x-le*nx[i], y] now[i - 1] = [x, y-le*ny[i]] break print(len(ans)) for i inrange(len(ans)): print(*ans[i])
intmain(){ int n, i, j; scanf("%d%d%d", &n, &i, &j); // UDLR 表示现在包出来的正方形的上下左右边界 int U = i, D = i; int L = j, R = j; printf("Yes\n%d\n", n - 1); for (int k = 1; k < n; k++) { if (U > 1 && L > 1) { U--; L--; printf("%d %d %d %d\n", U, L, D - U, R - L); } elseif (U > 1 && R < n) { U--; R++; printf("%d %d %d %d\n", U, R, D - U, L - R); } elseif (D < n && L > 1) { D++; L--; printf("%d %d %d %d\n", D, L, U - D, R - L); } else { D++; R++; printf("%d %d %d %d\n", D, R, U - D, L - R); } } return0; }
defsolve(): n,k,m,a,b = map(int, input().split()) if n % m == 0: print(0) return if k == 1: print(-1) return ls = [1] while ls[-1] <= 2e18: ls.append(ls[-1]*k)
idx = 0 for i inrange(1,len(ls)): if ls[i] > n: idx = i break ans = 1e18 for i inrange(idx): if i != 0: n //= k for j inrange(len(ls)): if (m - ((n*ls[j]) % m))%m <= ls[j]-1: ans = min(ans, b*i+a*j) break ans = min(ans, b*idx) print(ans)
voidsolve(){ scanf("%lld%lld%lld%lld%lld", &n, &K, &m, &a, &b); if (n % m == 0) { printf("0\n"); return; } if (K == 1) { printf("-1\n"); return; }
longlong ans = 1e18, cost = 0; while (true) { // base:乘法操作之后的范围区间左端点 // p:乘法操作之后范围区间的长度 longlong base = n % m, p = 1; for (int i = 0; ; i++) { // 距离下一个 m 的倍数还有多少 longlong delta = (m - base) % m; if (delta < p) { // 范围区间覆盖了 m 的倍数,更新答案 ans = min(ans, cost + i * a); break; } // 再做一次乘法操作 base = base * K % m; p *= K; } if (n == 0) break; // 枚举除法操作的次数 n /= K; cost += b; } printf("%lld\n", ans); }
intmain(){ int tcase; scanf("%d", &tcase); while (tcase--) solve(); return0; }
import sys from collections import deque from heapq import heappop, heappush input = sys.stdin.readline
defsolve(): """工人种类为左集合点,工程为右集合点,组成一个二分图""" dic = {} ls = list(map(int, input().split())) for i inrange(1,2*ls[0],2): dic[ls[i]] = ls[i+1] # 一开始所拥有的员工 n = int(input()) deg = [0]*(n+1) bonus = [{} for _ inrange(n+1)] g = {} for i inrange(1,n+1): ls = list(map(int, input().split())) # 工程 i 的要求 for j inrange(1,ls[0]*2,2): if ls[j] in dic and dic[ls[j]] >= ls[j+1]: continue# 该要求已满足 deg[i] += 1# 每一个工程未被满足的要求向工程连一条边,对应工程的 degree += 1 if ls[j] in g: heappush(g[ls[j]], (ls[j+1], i)) else: g[ls[j]] = [] heappush(g[ls[j]], (ls[j+1], i))
ls = list(map(int, input().split())) for j inrange(1, ls[0] * 2, 2): # 工程 i 的 bonus bonus[i][ls[j]] = ls[j+1]
ans = 0 q = deque() for i inrange(1,n+1): if deg[i] == 0: q.append(i) while q: idx = q.popleft() # 项目 idx 被完成,通过bonus更新要求 ans += 1 for x,val in bonus[idx].items(): dic[x] = dic.get(x,0)+val if x notin g: continue while g[x]: val,i = heappop(g[x]) if val > dic[x]: heappush(g[x], (val,i)) break deg[i] -= 1 if deg[i] == 0: q.append(i) print(ans)
// M[i] 表示第 i 项工程还有几条要求未满足 int M[MAXN + 10]; // B[i] 表示第 i 项工程的奖励 vector<pii> B[MAXN + 10];
// mp[i] 是一个按人数排序的小根堆,维护了与工种 i 有关的未满足需求 unordered_map<int, priority_queue<pii, vector<pii>, greater<pii>>> mp; // have[i] 表示公司现有工种 i 的员工数量 unordered_map<int, longlong> have; queue<int> q;
// 公司增加工种 t 的员工共 u 名 voidadd(int t, int u){ longlong &val = have[t]; val += u; priority_queue<pii, vector<pii>, greater<pii>> &pq = mp[t]; // 看哪些和工种 t 有关的需求被满足了 while (!pq.empty()) { pii p = pq.top(); if (p.first > val) break; pq.pop(); // 工程所有要求都被满足,加入队列 if ((--M[p.second]) == 0) q.push(p.second); } }
intmain(){ scanf("%d", &g); assert(g >= 1); for (int i = 1; i <= g; i++) scanf("%d%d", &A[i][0], &A[i][1]); scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &M[i]); for (int j = 1; j <= M[i]; j++) { int a, b; scanf("%d%d", &a, &b); mp[a].push(pii(b, i)); } int K; scanf("%d", &K); for (int j = 1; j <= K; j++) { int c, d; scanf("%d%d", &c, &d); B[i].push_back(pii(c, d)); } } // 把没有任何要求的工程加入队列 for (int i = 1; i <= n; i++) if (M[i] == 0) q.push(i); // 公司一开始就有的员工 for (int i = 1; i <= g; i++) add(A[i][0], A[i][1]);
int ans = 0; // 类似拓扑排序,不断从队列中拿出工程,并获得奖励 while (!q.empty()) { int idx = q.front(); q.pop(); ans++; for (pii p : B[idx]) add(p.first, p.second); } printf("%d\n", ans); return0; }