Codeforces Round #692 (Div. 2, based on Technocup 2021 Elimination Round 3)

A.In-game Chat

题目:就是从后面数连着的‘('的个数是不是严格比剩下的字符多

思路:水题,直接从后往前遍历即可

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int main(){
    char s[1500];
    int t;
    scanf("%d",&t);
    while(t--){
       // scanf("%s",&s);
        int n;
        int sum=0,flag=0;
        scanf("%d",&n);
        scanf("%s",&s);
        for(int i=n-1;i>=0;i--){
            if(s[i]==')'&&flag==0){
                sum++;
            }else{
                flag=1;
            }
        }
        if(sum>n-sum){
            printf("Yes\n");
        }else{
            printf("No\n");
        }
    }
}

B.Fair Numbers

题目:一个数是公平的,当这个数可以整除它的每一位非零数。问给定一个数n,找到最小的数x(n<=x)是公平的

思路:暴力模拟就行,直接判断每个数是不是公平的即可(因为1-9的最小公倍数是2520,很小)

这个题当时看到这么多交的可能是暴力,写完以后发现最坑的地方是%0,当0是除数的情况

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        long long int  num;
        int a[150];
        scanf("%lld",&num);
        for(long long int i=num;;i++){
            long long int  n=i;
            int flag=0;
            
            while(n!=0){
                int t=(n%10);
                if(t==0){
                    n/=10;
                    continue;
                }
                if(i%t!=0){
                    flag=1;
                    break;
                }
 
               //printf("%lld\n",i);
                n/=10;
 
            }
            if(flag==0){
                printf("%lld\n",i);
                break;
            }
        }
    }
}

C.Peaceful Rooks

题目:一个二维平面(n×n),在平面上有m个点。在进行一次操作时,可以选择其中的一个点进行平行或者垂直移动,并且移动后这m个点的横纵坐标两两不相等,问为使这m个点都在主对角线上(坐标的横纵坐标相等)所需要的最小的移动次数是多少

思路:最原始的平移方法就是通过移动直接平移或者垂直移动到所在位置的主对角线上,通过把二维平面转换为图,然后如果存在环的话,就是这些点不能够通过上述最简单的移动方式达到,因为他们相互限制,这样的话就需要多加一步,随便一个点移除这个状态。

这个题就要记住一个是找根和并查集,再就是二维平面转换为图的问题。类似的问题还有小孩子们分巧克力的问题,x和y是某个小孩子最喜欢的巧克力,然后每个小孩子分配到自己喜欢的巧克力最少需要多少步

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int maxx=1e5+10;
int parent[maxx];
int findd(int x){
    if(parent[x]==x){
        return x;
    }
    return parent[x]=findd(parent[x]);
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        scanf("%d %d",&n,&m);
        //int parent[maxx];
        for(int i=1;i<=n;i++){
            parent[i]=i;
        }
        int sum=0;
        for(int i=0;i<m;i++){
            int x,y;
            scanf("%d %d",&x,&y);
            if(x==y){
                continue;
            }
            sum++;
            int fx=findd(x),fy=findd(y);
            if(fx==fy){//有环,并且自己死锁的那种情况已经排除
                sum++;
            }else{
                parent[x]=fy;
            }
        }
        printf("%d\n",sum);
    }
}

 

posted @ 2021-04-25 22:03  bonel  阅读(57)  评论(0编辑  收藏  举报