0
点赞
收藏
分享

微信扫一扫

第46届ICPC 澳门 热身赛 + 正式赛(未补)

日月同辉9908 2022-05-02 阅读 51
算法c++

热身赛
A.一定不会产生冲突,所以从1开始必定是最长的

bool vis[maxn];//这个位置标记取了

int main() {
    IOS;
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; ++i){
        ll j = i;
        while(j <= n &&!vis[j]){//注意这里一定要先判j的大小,否则会段错误
            cout << j << " ";
            vis[j] = true;
            j += k;
        }
    }
        return 0;
}

B.
太难受了,自己写的一直找不出错误。
以后这么写吧…

int val[maxn];//已ac
map<int, int> mp;
int sat[maxn];

int main() {
    IOS;
    int t;
    cin >> t;
    while(t--){
        re(sat);
        re(val);
        mp.clear();
        int n, k, m;
        cin >> n >> k >> m;
        for (int i = 1; i <= n; ++i){
            cin >> val[i];
            ++mp[val[i]];//记下是奇数个
            sat[i] = mp[val[i]];//赋给这一位
        }
        int kk = m % n;
        for(int i = 1; i <= n; ++i){
            int te = m / n;
            if(m % n >= i)
                ++te;
            if(mp[val[i]] % 2 == 0){
                if(sat[i] % 2 != 0){
                    te = 0;
                }
            }
            else {
                if(sat[i] % 2 == 0)
                   te = (te + 1) / 2;//啊这是为什么啊
                   //懂了,要看这个数的位数和这个次数能不能对应
                else
                    te = te / 2;
            }
            if(i == 1)
                cout << te;
            else
                cout << " " << te;
        }
        cout << endl;
    }
        return 0;
}

还是第二种方法好懂。

分析了下,这个分类更细。
以后加不加可以写成 t += (n >= i)
int main() {
    IOS;
    int t;
    cin >> t;
    while(t--){
        re(sat);
        re(val);
        mp.clear();
        int n, k, m;
        cin >> n >> k >> m;
        for (int i = 1; i <= n; ++i){
            cin >> val[i];
            ++mp[val[i]];//记下是奇数个
            sat[i] = mp[val[i]];//赋给这一位
        }

        int na = m / n, nb = m % n;
        for(int i = 1; i <= n; ++i){
            int te = 0;
            if(mp[val[i]] % 2 == 0){
                if(sat[i] % 2)
                    te = 0;
                else
                    te = na + (nb >= i);
            }
            else {
                te = na / 2;
                if(na % 2 == 0){
                    if(sat[i] % 2 == 0)
                        te += (nb >= i);
                }
                else {
                    if(sat[i] % 2)//一共奇个、奇数次、奇数位
                        te += (nb >= i);
                    else
                        ++te;
                }
            }
            if (i == 1)
                cout << te;
            else
                cout << " " << te;
        }
        if(t >= 1)
            cout << endl;
    }
    return 0;
}

C.
瞎推得,数据范围决定了显然不可能是一个一个试。
开始推的是只由最后一次决定,中间就算是负数也是越走越远。
50%wa后猜测第一次也许会更远,判了第一次后就过了

#define PII pair<int, int>

PII R = {1, 0}, U = {0, 1}, D = {0, -1}, L = {-1, 0};

int main() {
    IOS;
    int t;
    cin >> t;
    while(t--){
        ll n, k;
        cin >> n >> k;
        string s;
        cin >> s;
        //我悟了,这个过程中的最大值
        //只需要算最后一次的
        ll x = 0, y = 0;
        ll ans = abs(x) + abs(y);
        for (int i = 0; i < n; ++i){
            if(s[i] == 'R'){
                x += R.first;
                y += R.second;
            }
            else if(s[i] == 'U'){
                x += U.first;
                y += U.second;
            }
            else if(s[i] == 'D'){
                x += D.first;
                y += D.second;
            }
            else if(s[i] == 'L'){
                x += L.first;
                y += L.second;
            }
            ans = max(ans, abs(x) + abs(y));
        }
        x = (1ll) * x * (k - 1);
        y = (1ll) * y * (k - 1);
        ans = max(ans, abs(x) + abs(y));
        for (int i = 0; i < n; ++i){
             if(s[i] == 'R'){
                x += R.first;
                y += R.second;
            }
            else if(s[i] == 'U'){
                x += U.first;
                y += U.second;
            }
            else if(s[i] == 'D'){
                x += D.first;
                y += D.second;
            }
            else if(s[i] == 'L'){
                x += L.first;
                y += L.second;
            }
            ans = max(ans, abs(x) + abs(y));
        }
        cout << ans << endl;
    }
    return 0;
}

先去补四川省的

举报

相关推荐

(Java)2022GPLT热身赛 “浪漫侧影“

算法4-中兴捧月杯热身赛1

0 条评论