首页 > 其他分享 >iwtgm-35

iwtgm-35

时间:2023-12-13 22:56:41浏览次数:23  
标签:int void iwtgm 35 cin while solve ans

Codeforces Round 913 (Div. 3)

A.

把给定坐标的同一行同一列的每个数都输出(除本身)

void solve() {
    char c;
    int d;
    cin>>c>>d;
    for(int i=1;i<=8;i++){
        if(i==d)continue;
        cout<<c<<i<<endl;
    }
    for(int i=0;i<=7;i++){
        char tmp=(char)('a'+i);
        if(tmp==c)continue;
        cout<<tmp<<d<<endl;
    }
}

B.

字符串模拟,用deque较为方便,大小写字母分开存(同时存下下标)
最后合并放入vector排序,输出

deque<pair<int,char>>low,up;
void solve() {
    string s;cin>>s;
    for(int i=0;i<s.size();i++){
        if(s[i]=='b'){
            if(low.size()){
                low.pop_back();
            }
        }else if(s[i]=='B'){
            if(up.size()){
                up.pop_back();
            }
        }else if(s[i]>='a'&&s[i]<='z'){
            low.push_back({i,s[i]});
        }else if(s[i]>='A'&&s[i]<='Z'){
            up.push_back({i,s[i]});
        }
    }
    vector<pair<int,char>>v;
    while(low.size()){
        v.push_back(low.front());low.pop_front();
    }
    while(up.size()){
        v.push_back(up.front());up.pop_front();
    }
    sort(v.begin(),v.end());
    for(int i=0;i<v.size();i++){
        cout<<v[i].second;
    }
    cout<<endl;
}

C.

不同的可以两两消除,那么我们关心相同数量最多的
如果最大数比其他的数量都多,那么一定会剩下最大数-其他数量
若小等于其他数量,因为相同数最大的已经挑出来了,其他相同也可以与最大抵消,可以优先让其他数先两两抵消
奇数一定会剩下一个(因为两两消除)

void solve() {
    int n;cin>>n;
    string s;cin>>s;
    vector<int>v(30);
    int ma=-inf;
    for(int i=0;i<s.size();i++){
        int tmp=s[i]-'a';
        v[tmp]++;
        ma=max(ma,v[tmp]);
    }
    int other=s.size()-ma;
    if(ma<=other){
        if(s.size()%2==0){
            cout<<0<<endl;
            return ;
        }else {
            cout<<1<<endl;
            return ;
        }
    }else{
        cout<<ma-other<<endl;
    }
}

D.

二分答案,二分确实是个好东西
重点是更新区间,往左跳、往右跳,和线段端点取小

int n, l[N], r[N];
 
bool check(int k) {
    int L = 0, R = 0;
    for (int i = 1; i <= n; i++) {
        int jump_l = L - k, jump_r = R + k;
        if (jump_l > r[i] || jump_r < l[i]) return false;
        L = max(jump_l, l[i]), R = min(jump_r, r[i]);
    }
    return true;
}
 
void solve() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> l[i] >> r[i];
    }
    int L = 0, R = 1e9, ans = -1;
    while (L <= R) {
        int mid = (L + R) / 2;
        if (check(mid)) {
            ans = mid;
            R = mid - 1;
        } else {
            L = mid + 1;
        }
    }
    cout << ans << endl;
}

E.

首先每一位不能有进位
那么每一位对应的三个数相加等于n的对应位的数
数字的每一位都是独立的,用乘法原理

#define int long long
map<int,int>mp;
void solve() {
    for(int i=0;i<=9;i++){
        for(int j=0;j<=9;j++){
            for(int k=0;k<=9;k++){
                mp[i+j+k]++;
            }
        }
    }
    int t;cin>>t;
    while(t--){
        int n;cin>>n;
        ll ans=1;
        while(n){
            int tmp=n%10;
            ans*=mp[tmp];
            n/=10;
        }
        cout<<ans<<endl;
    }
}

F.

可知两种操作都不会改变元素的相对顺序
把它看成一个环,若存在一个起点和一个终点,起点到终点是非递减的,并且囊括了所有点,那么这个序列是可行的
现在考虑操作次数
分类讨论顺逆时针
顺时针:
一种方法:就是把起点及以后的点都放到前面去,操作次数就是起点及起点以后的点的个数
另一种方法:先翻转,把终点及终点后的数都放到前面,最后再翻转一次
取两种方法的操作次数的最小值
逆时针:
可以先翻转成顺时针,按照顺时针的方法做
区别在于第一种方法要加上翻转的一次操作
第二种方法只+1,(在顺时针的时候+2),因为最开始已经+1
可以手玩模拟一个样例就能得知

void solve() {
    int n,t,q;
    cin>>n;
    vector<int>a(n);
    for(auto &i:a)cin>>i;
    t=*min_element(a.begin(),a.end());
    q=*max_element(a.begin(),a.end());
    int res=inf;
    for(int i=0,f=1;i<n;i++){
        if(a[i]!=t)continue;
        if(a[(i-1+n)%n]!=q)continue;
        f=1;
        for(int j=1;j<n&&f;j++){
            if(a[(i+j)%n]>=a[(i+j-1)%n])continue;
            f=0;
        }
        if(f)res=min(res,min((n-i)%n,i+2));
        break;
    }
    reverse(a.begin(),a.end());
    for(int i=0,f;i<n;i++){
        if(a[i]!=t)continue;
        if(a[(i-1+n)%n]!=q)continue;
        f=1;
        for(int j=1;j<n&&f;j++){
            if(a[(i+j)%n]>=a[(i+j-1)%n])continue;
            f=0;
        }
        if(f)res=min(res,min(i+1,(n-i)%n+1));
        break;
    }
    if(res==inf){
        cout<<-1<<endl;
    }
    else cout<<res<<endl;
}

G.

改变第 i 盏灯的状态同时也会改变第 i盏灯的状态,所以尝试从 i向 ai 连一条有向边
n个点,n条边,基环树
对于那些状态为1且入度为0的点u,必须要对第u盏灯进行一次操作将其状态变为0
因此可以先对基环树进行拓扑排序,把挂在环上的链先处理完,最后再处理环。
遍历环上的每一个点并统计状态为1的点的数量,如果这个数量是奇数那么无解(因为每次都会同时改变两盏灯的状态,因此状态为1的点的数量也会改变偶数次,即永远不会变成偶数)。否则一定可以将环上点的状态都变成0.
容易知道在任意方案中每个点要么被改变一次,要么不改变。因此只需选择环中的一个点,对两种情况都模拟一边,选择改变次数最小的方案即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
string s;
int ne[N], deg[N];//与i相连的一条边的另一点,入度
queue<int>q;
void solve() {
    int n;
    cin>>n>>s;s=" "+s;
    memset(deg, 0, n + 10 << 2);
    for (int i = 1; i <= n; i++) {
        int x;
        cin>>x;
        ne[i] = x;
        deg[x]++;
    }
    for (int i = 1; i <= n; i++) {//拓扑
        if (!deg[i]) q.push(i);
    }
    vector<int> ans;
    while (q.size()) {
        int u = q.front();q.pop();
        if (s[u] & 1) {
            s[u] ^= 1;
            s[ne[u]] ^= 1;
            ans.push_back(u);
        }
        if (--deg[ne[u]] == 0) q.push(ne[u]);
    }
    for (int i = 1; i <= n; i++) {
        if (deg[i]) {//环上
            int u = i, cnt = 0, sum = 0;
            while (deg[u]) {
                deg[u] = 0;
                cnt++;    // 统计环中点的数量
                sum += s[u] & 1;    // 统计状态为1的点的数量
                u = ne[u];
            }
            if (sum & 1) {    // sum是奇数则无解
                printf("-1\n");
                return;
            }
            vector<int> p1, p2;
            u = i;    // 任选环中一个点
            for (int j = 0, t = 0; j < cnt; j++) {    // 这个点改变一次
                if (!j || (t ^ s[u]) & 1) {//一条边的两个点都是1,只需改变第一个点
                    t = 1;                 //若一条边的1个点是0,一个点是1,则要改变2次
                    p1.push_back(u);
                }
                else {
                    t = 0;
                }
                u = ne[u];
            }
            u = i;
            for (int j = 0, t = 0; j < cnt; j++) {    // 这个点不改变
                if (j && (t ^ s[u]) & 1) {
                    t = 1;
                    p2.push_back(u);
                }
                else {
                    t = 0;
                }
                u = ne[u];
            }
            if (p1.size() > p2.size()) p1.swap(p2);    // 选择改变次数最小的方案
            for (auto &x : p1) {
                ans.push_back(x);
            }
        }
    }
    printf("%d\n", ans.size());
    for (auto &x : ans) {
        printf("%d ", x);
    }
    printf("\n");
}

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        solve();
    }

    return 0;
}

标签:int,void,iwtgm,35,cin,while,solve,ans
From: https://www.cnblogs.com/wwww-/p/17897602.html

相关文章

  • iwtgm-34
    EducationalCodeforcesRound159(RatedforDiv.2)A.只要有0就是yes因为若只有0,显然满足条件若0和1都有,一定会有01相邻的情况,我们插入0后,仍有01相邻的情况,即我们可以无限+0,那么最后0的个数一定可以大于1voidsolve(){intn;cin>>n;strings;cin>>s;intc......
  • 硬件开发笔记(十六):RK3568底板电路mipi摄像头接口原理图分析、mipi摄像头详解
    前言  本篇继续分析底板原理图mipi电路原理图、mipi摄像头输入硬件接口详解。<br>RK3568芯片摄像头接口  查看RK3568的芯片手册,摄像头接口并不支持直接sensor模拟信号输入,只能接收mipi信号,RK3568的摄像头接口引脚如下:    只支持mipi的数字信号摄像头。  本来计划......
  • 【线段树入门】P3353 在你窗外闪耀的星星(区间求和)
    这题正解是前缀和,我用线段树练练手><11//笔记-自用22//#pragmaGCCoptimize("Ofast")33//#pragmaGCCoptimize("unroll-loops")44#define_CRT_SECURE_NO_WARNINGS55#defineAll(a)a.begin(),a.end()66#defineINF214748364777......
  • 硬件开发笔记(十六):RK3568底板电路mipi摄像头接口原理图分析、mipi摄像头详解
    前言  本篇继续分析底板原理图mipi电路原理图、mipi摄像头输入硬件接口详解。 RK3568芯片摄像头接口  查看RK3568的芯片手册,摄像头接口并不支持直接sensor模拟信号输入,只能接收mipi信号,RK3568的摄像头接口引脚如下:    只支持mipi的数字信号摄像头。  本......
  • RK3568 AMP测试验证说明
    本文基于HD-RK3568-IOT评估板进行验证。1. RK3568 AMP SDK获取在虚拟机内创建rk356x-amp-sdk目录,后续在该目录下执行命令,在rockchip git库下载AMP SDK。 2. AMP功能验证目前在RK3568上分别验证了1linux+3hal、1linux+3rtt、3linux+1hal、3linux+1rtt一共4种模式;4种模......
  • [QOJ1359] Setting Maps
    题目链接\(k=1\)的时候显然是最小割。把一个点\(u\)拆成两个点,中间连流量为\(c_u\)的边。那么考虑扩展到\(k\)更大的情况。把上图的每个入点和出点都拆成\(k\)个。把节点\(u\)第\(i\)层入点和第\(i+1\)层入点连接,再把第\(i\)层入点和所有满足\(j>i\)层的出......
  • LOJ #3353. 「CEOI2020」象棋世界
    题面传送门什么缝合怪(以下默认判掉一步走到。Section1:P容易发现不会改变纵坐标,简单判断即可。Section2:R两步,两种方案。Section3:Q因为\(n\geqm\),所以直走两种方案,先斜着走再竖着走两种方案是一定有的。以下默认其先往左下走,往右下走翻转再做一遍就好了。如果......
  • Linux学习35- python3.9出现ModuleNotFoundError: No module named '_ctypes'的解决
    遇到问题pip安装第三方库的时候报错ModuleNotFoundError:Nomodulenamed'_ctypes'File"/usr/local/python3/lib/python3.9/ctypes/__init__.py",line7,in<module>from_ctypesimportUnion,Structure,ArrayModuleNotFoundError:Nomodulen......
  • P7735 [NOI2021] 轻重边 题解
    是一道树剖好题,之前听lsl讲过一点,于是很快就做出来了。题意:有一个\(n\)个节点的树,最开始的时候所有边都是轻边,维护两个操作:操作一:将\(u\)到\(v\)的路径中经过的所有点的邻边变为轻边,再将这条路径上的边变为重边。操作二:求出\(u\)到\(v\)这条路径上有多少条重边......
  • K3588芯片助力,全新单板计算机ArmSoM-Sige7震撼发布!
    RK3588芯片助力,全新单板计算机ArmSoM-Sige7震撼发布!近日,我们欣喜地宣布推出一款全新的单板计算机,搭载着强大的RK3588芯片,为用户提供更卓越的计算性能和多样化的应用场景。这一新产品的发布标志着我们在技术创新和产品研发方面取得了重要突破,为用户提供了更为出色的计算体验,Sige7......