Codeforces Round #653 (Div. 3) 部分题解

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);
    }
}
View Code

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());
    }
}
View Code

C:

扫描二维码关注公众号,回复: 11393088 查看本文章

给定一个括号序列,你可以通过把某个括号移动到最前或最后来调整,要求最小的调整次数使得最后是合法的。

显然,当你把已经合法的也就是相邻的一对括号删去后,剩下的括号数除以二就是答案。

因此可以利用栈来模拟。

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);
    }
}
View Code

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]);
    }
}
View Code

E:

猜你喜欢

转载自www.cnblogs.com/hznumqf/p/13210457.html