首页 > 其他分享 >第 66 场周赛

第 66 场周赛

时间:2022-09-03 17:47:59浏览次数:85  
标签:周赛 int pos ++ read 66 main size

A 奇偶判断

 int main() {
	string s; cin >> s;
	int x = s[6] - '0';
	if(x % 2) cout << 1 << endl;
	else cout << 0 << endl;
	return 0;
}

B 字母补全

思路:

依次枚举每个位置的后26位(包括自己)判断是否每个字母只出现一次,如果否,则继续往下走,否则就再把?填充进去。

代码:

int main() {
    string s; cin >> s;
    int flag = 0;
    for(int i = 0, j = 0; i < s.size(); i++) {
        if(s[i] != '?') w[s[i] - 'A']++;
        while(w[s[i]-'A'] > 1) w[s[j++]-'A']--;
        if(i - j == 25) {
            flag = 1;
            for(int x = j; x <= i; x++) {
                if(s[x] == '?') {
                    for(int k = 0; k < 26; k++) {
                        if(w[k]==0) {
                            s[x] = (char)('A'+k);
                            w[k]++;
                            break;
                        }
                    }
                }
            }
            break;
        }
    }
    if(!flag) cout << -1 << endl;
    else {
        for(int i = 0; i < s.size(); i++) {
            if(s[i] == '?') cout << 'A';
            else cout << s[i];
        }
        cout << endl;
    }
	return 0;
}

C 整数分组

思路:

先把个数为1的平均分给两个人,个数为2的对结果不构成影响,再去找个数大于2的,只需要把其中一个给个数少的A,其他的给个数多一个的B就行了。

代码:

int main() {
    int n = read();
    for(int i = 0; i < n; i++) {
        int x = read();
        pos[x].push_back(i);
    }
    int cnt = 0;
    for(int i = 1; i < N; i++) 
        if(pos[i].size() == 1) 
            cnt++;
    string ans(n, 'B');
    for(int i = 1, k = 0; i < N; i++) {
        if(pos[i].size() == 1) {
            k++;
            if(k <= cnt / 2) ans[pos[i][0]] = 'A';
            else ans[pos[i][0]] = 'B';
        }
    }
    bool success = true;
    if(cnt % 2) {
        success = false;
        for(int i = 1; i < N; i++) {
            if(pos[i].size() > 2) {
                ans[pos[i][0]] = 'A';
                for(int j = 1; j < pos[i].size(); j++) ans[pos[i][j]] = 'B';
                success = true;
                break;
            }
        }
    }
    if(!success) cout << "NO" << endl;
    else {
        cout << "YES" << endl;
        cout << ans << endl;
    }
	return 0;
}

另外附上比赛的时候的T3代码(只过了17个样例):

int main() {
    int n = read();
    for(int i = 0; i < n; i++) {
        w[i] = read();
        cnt[w[i]]++;
        pos[w[i]].push_back(i);
    }
    int k = 0;
    for(int i = 1; i <= 100; i+=2) {
        for(int j = 0; j < n; j++) {
            if(cnt[w[j]] == i && !st[w[j]]) {
                st[w[j]] = 1;
                if(k) {
                    int t = pos[w[j]].size();
                    //cout << t << endl;
                    for(int tt = 0; tt < t - 1; tt++) dispute[pos[w[j]][tt]] = 1;
                    dispute[pos[w[j]][t-1]] = 2;
                    k = 0;
                }else {
                    int t = pos[w[j]].size();//cout << t << endl;
                    for(int tt = 0; tt < t - 1; tt++) dispute[pos[w[j]][tt]] = 2;
                    dispute[pos[w[j]][t-1]] = 1;
                    k = 1;
                }
               // cout << k << endl;
            }
        }
    }
    if(k) {
        for(int i = 2; i <= 100; i+=2) {
            for(int j = 0; j < n; j++) {
                if(cnt[w[j]] == i && !st[w[j]] &&  i != 2) {
                    st[w[j]] = 1;
                    if(k) {
                        int t = pos[w[j]].size();
                        //cout << t << endl;
                        for(int tt = 0; tt < t - 1; tt++) dispute[pos[w[j]][tt]] = 1;
                        dispute[pos[w[j]][t-1]] = 2;
                        k = 0;
                        break;
                    }else {
                        int t = pos[w[j]].size();//cout << t << endl;
                        for(int tt = 0; tt < t - 1; tt++) dispute[pos[w[j]][tt]] = 2;
                        dispute[pos[w[j]][t-1]] = 1;
                        k = 1;
                    }
                   // cout << k << endl;
                }
            }
            if(!k) break;
        }
    }
    if(k) cout << "NO" << endl;
    else {
        cout << "YES" << endl;
        for(int i = 0; i < n; i++) {
            if(!st[w[i]]) cout << "A";
            else if(dispute[i] == 1) cout << 'A';
            else cout << 'B';
        }
    }
	return 0;
}

标签:周赛,int,pos,++,read,66,main,size
From: https://www.cnblogs.com/MoonSkyy/p/16653148.html

相关文章

  • P1966 [NOIP2013 提高组] 火柴排队做题笔记
    这题和P5677一样,是从树状数组题单里翻出来的,由于开始看时感觉题解代码写的不是很清晰,就先放进了做题计划里,后来几次看这道题,但由于第一次看题可能留下了一些心理阴影以及......
  • 基于 ESP8266_RTOS_SDK 实现声控灯
    #include<stdio.h>#include<string.h>#include<stdlib.h>#include<stdint.h>#include<stdbool.h>#include"driver/gpio.h"#include"driver/hw_timer.h"#in......
  • ESP8266转RS485/RS232/TTL控制板-下载和运行第一个程序(arduino)
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/circuit_module/8266_485_industrial"frameborder="0"scrolling="auto"width="100%"height="1500"><......
  • P1966 [NOIP2013 提高组] 火柴排队
    有两盒火柴,每盒装有\(n\)根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同。其中\(a_i\)表示第一列火柴中第\(i\)个火柴的高......
  • gym-101667K Untangling Chain
    UntanglingChain构造显然对于一条线段来说,走到头只有左右两边可以选择,换句话说,第一次是横着走,第二次是竖着走,因此可以构造一个走法,让他每次都突破自身走过路径的四个边(......
  • AtCoder Beginner Contest 266 G,H
    G考虑先放G和B,此时共有\(C_{G+B}^{B}\)种方案。然后选出\(k\)个G,在前面放上\(R\),共有\(C_{G}^{k}\)种方案。最后我们放剩下的\(R-K\)个R,考虑目前哪些区间内部可以放一段......
  • 使用ESP8266nodeMCU 向微信推送模板数据
    使用HTTPS协议向微信公众号推送消息,(使用ESP8266的低成本实现)前几天被朋友问到这个东西的实现方式,花了一下午时间研究一下,特此记录。没有排版比较乱。      ......
  • ASR6601:国产M4内核LoRa SoC-ASR6601硬件设计指导
      ASR6601是一款通用的Sub-GHz无线通讯SoC芯片,该芯片集成了Sub-GHz射频收发器和32位的RISCMCU。Sub-GHz射频收发器不仅支持LoRa调制,还支持(G)FSK和G......
  • 662. 二叉树最大宽度
    题目描述给你一棵二叉树的根节点root,返回树的最大宽度。树的最大宽度是所有层中最大的宽度。每一层的宽度被定义为该层最左和最右的非空节点(即,两个端点)之间......
  • gym-101667E How Many to Be Happy
    HowManytoBeHappy?最小割因为是最小生成树,因此可以考虑对于一条边来说,他的左右两端的点视为处于两个不同的集合,然后只通过该边进行连接,这样最小生成树就必然会利用这......