A:
给出 x,y 求出最大的 k , 0<=k<=n 且 k mod x = y
直接公式表达出来就好了
int main() { int T; scanf("%d", &T); ll k, x, y, n; while (T--) { scanf("%lld%lld%lld", &x, &y, &n); ll kk = (n - y) / x; printf("%lld\n", kk * x + y); } }
B:
给定一个x,可以*2,可以/6 (前提是可以整除)
问能否变成1,若能,输出最小步数。
显然,若因子中无3,那必然无法通过/6来到1,可直接return false 。
剩下的贪心就好了
ll n; int solve() { if (n == 1) return 0; if (n % 3 != 0) return -1; int tmp = n; int cnt = 0; while (tmp != 1) { cnt++; if (tmp % 3 != 0) return -1; if (tmp % 6 == 0) tmp /= 6; else tmp <<= 1; } return cnt; } int main() { int T; scanf("%d", &T); while (T--) { scanf("%lld", &n); printf("%d\n", solve()); } }
C:
给定一个括号序列,你可以通过把某个括号移动到最前或最后来调整,要求最小的调整次数使得最后是合法的。
显然,当你把已经合法的也就是相邻的一对括号删去后,剩下的括号数除以二就是答案。
因此可以利用栈来模拟。
char s[55]; int main() { int T; int n; scanf("%d", &T); while (T--) { stack<char> st; scanf("%d", &n); scanf("%s", s); int len = strlen(s); int cnt = 0; for (int i = 0; i < len; i++) { if (s[i] == '(') st.push('('); else if (!st.empty()) st.pop(), cnt++; } printf("%d\n", (len - cnt * 2) / 2); } }
D:
你有一个 x = 0 每次可以使某个ai + = x ,x++ 也可以x++ 。
求出当整个数组的所有元素都整除k时,x的大小。
日常乱搞。。
ll a[maxn]; map<ll, ll > mp; int main() { int T; int n, k; scanf("%d", &T); while (T--) { mp.clear(); scanf("%d%d", &n, &k); for (int i = 0; i < n; i++) { scanf("%lld", &a[i]); if (a[i] % k == 0) { continue; } if (a[i] > k) { ll x = ceil(a[i] * 1.0 / k); a[i] = k * x - a[i]; } else a[i] = k - a[i]; if (mp[a[i]]) { mp[a[i]]++; } else mp[a[i]] = 1; } ll Max = 0; if (!mp.empty()) { for (auto it = mp.begin(); it != mp.end(); it++) { ll res = it->first; ll tmp = it->second; Max = max(Max, res + k * (tmp - 1)); } } if (Max) Max++; printf("%lld\n", Max); //printf("%lld\n", a[5]); } }
E: