【浮*光】【Codeforces Round #480 (Div. 2)】解题报告

这篇博客是关于Codeforces Round #480 (Div. 2)的解题报告,详细解析了980A - Links and Pearls、980B - Marlin、980C - Posterized、980D - Perfect Groups和980E - The Number Games等题目。博主通过深入分析题目所涉及的数学原理和算法,给出了求解这些问题的思路和复杂度分析。
摘要由CSDN通过智能技术生成

980A - Links and Pearls

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
#include <map>
#include <vector>
#include <set>
#include <queue>
using namespace std;
typedef long long ll;

/*【题意】有一个环形项链,‘-’代表连接的链,‘o’代表珍珠,
可以随意拆,随意组装,只能使用现有的-和o,不可以丢掉,
能否组合成:每个珍珠之间的链的长度都相等。
【分析】因为是环,所以有几个珍珠,就必然有几个间隔,
这些间隔内的链长都相等,即链的总数整除珍珠总数即可YES,否则NO。
特判:没有珍珠,判定为YES。  */

char ss[110];  
int main(){  
    while(~scanf("%ss",ss+1)){  
        ll len=strlen(ss+1),ans1=0,ans2=0;  
        for(ll i=1;i<=len;i++){  
            if(ss[i]=='o') ans1++;//统计个数  
            else ans2++;  
        }  
        if(ans1==0){ printf("YES\n"); continue; } //特判  
        if(ans2%ans1==0) printf("YES\n");
        else printf("NO\n");  
    }  
    return 0;  
}  


980B - Marlin

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
#include <map>
#include <vector>
#include <set>
#include <queue>
using namespace std;
typedef long long ll;
/* 给你一个4*n的网格,保证n为奇数,让你在其中放k个障碍物(不能放在边界)
使得【从左上角走到右下角的最短路的方案数】等于【左下走到右上的最短路的方案数】
分析》由于给出的条件 3≤n≤99, 0≤k≤2×(n−2) ————> 一定可以
1" k为偶数时,以{纵向为对称轴}进行摆放即可。
2" ①k为奇数且小于等于n-2时,{横向对称}摆放:
...........
...........
...#####...
...........
②k等于n时:
.............
.#.........#.
.###########.
.............
③k大于n时,在上图空闲的位置随便填即可。   */
int n,K; char a[6][105];
int main(){
    scanf("%d%d",&n,&K);
    for(int i=1;i<=4;++i)//初始化为无障碍
        for(int j=1;j<=n;++j) a[i][j]='.';
    puts("YES");//0≤k≤2×(n−2),一定可以
    if(K%2==0){
        K/=2; //偶数的情况:按照纵向对称放置,↓↓可在2,3行随意选择
        for(int i=1;i<=K;++i) a[2][i+1]=a[3][i+1]='#';
    }
    else{//模拟奇数的情况
        if(n==1) a[2][2]='#';
        else if(K<=n-2){
            for(int i=1,j=(n-K)/2+1;i<=K;++i,++j)
                a[3][j]='#'; //先摆第三行
        }
        else if(K==n){
            for(int i=1,j=2;i<=n-2;++i,++j)
                a[3][j]='#';
            a[2][2]=a[2][n-1]='#'; //对称
        }
        else{
            for(int i=1,j=2;i<=n-2;++i,++j)
                a[3][j]='#';
            a[2][2]=a[2][n-1]='#';
            for(int i=3,j=1;i<=n-2 && j<=K-n;++i,++j){
                a[2][i]='#';
            }
        }
    }
    for(int i=1;i<=4;++i){
        for(int j=1;j<=n;++j) putchar(a[i][j]);
        printf("\n");
    }
    return 0;
}
//——The Solution By AutSky_JadeK From UESTC 
//出处:http://www.cnblogs.com/autsky-jadek/

980C - Posterized

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
#include <map>
#include <vector>
#include <set>
#include <queue>
using namespace std;
typedef long long ll;

/* 给出n个数,都属于区间[0,255],把[0,255]划分成多个长度 <=k 的不重叠的子区间。
每个数必须包含在一个子区间内,且这个数的价值是这个子区间的左端点。
要求 这n个价值 字典序最小,输出最小价值和时的各个价值。 */

/* 分析》字典序最小,即定区间时左端点尽量小。
枚举 区间[p[i]-k+1,p[i]] 定左端点l,如果这个区间内最大的后缀没有被占用,
即 [l, p[i]] 内的数都没被占用。右端点暂时定在 p[i] 。
因为 l-1 位置肯定已经被另一个区间占用了,判断能否合并,
<----(合并条件)l-1 位置的区间的左端点能拓展到 p[i] 位置。  */

bool b[256];
int n,k,p[256];
int main(){
    int x,t,tt; scanf("%d%d",&n,&k);
    for(int i=1;i<=n;++i){
        scanf("%d",&x); t=-1;
        for(int j=x;j>=0;--j)
            if(b[j]){ t=j; break; }
        if(t==-1){
            if(x>=k){
                b[x-k+1]=1; p[x-k+1]=x;
                printf("%d%c",x-k+1,i==n ? '\n' : ' ');
            }
            else{
                b[0]=1; p[0]=x;
                printf("0%c",i==n ? '\n' : ' ');
            }
        }
        else if(t+k-1<x){
            tt=max(x-k+1,p[t]+1);
            b[tt]=1; p[tt]=x;
            printf("%d%c",tt,i==n ? '\n' : ' ');
        }
        else{
            p[t]=max(p[t],x);
            printf("%d%c",t,i==n ? '\n' : ' ');
        }
    }
    return 0;
}

980D - Perfect Groups

题解:

首先让我们检查完美的方块;一个完美的正方形是一个数字x,可以写成一个整数和它本身的乘积y * y。这意味着对于数字x的每个素数因子,该因子的频率必须是偶数,因此它可以在两个y中的每一个之间均匀分布。
对于一个组中的每两个数字a和b,对于一个素因子pi,或者a和b都具有偶数的pi频率,或者它们都具有奇数的频率。
因此,使用这种观察,对于阵列中的每个数字x,我们可以丢弃所有相同的素数因子对(每个因子以奇数频率保留一个副本)。
例如,数字40的因素是2,2,2,5,所以我们可以忽略第一对2,因为它们是冗余的,并将其转换为数字2,5,这是数字10。

现在,在用奇数因素的乘积替换每个数字后,我们可以计算每个子数组中不同元素的数量,因为每个元素只能与其副本一起分组。这可以通过检查所有可能的子阵列并保持频率数组来计算其中不同元素的数量来完成。
- 元素需要映射到1到n之间的非负整数,所以我们不用去使用一个集来对它们进行计数。
- 在子数组中存在零的情况下需要小心。零可以加入任何组,所以除非子数组只包含零,否则我们可以忽略它们。
复杂度:O(n×sqrt(maxai)+n2)

原版:First let us examine perfect squares; a perfect square is a number x that can be written as the product of an integer and itself yy. This means that for each prime factor of the number x, the frequency of that factor must be even so it can be distributed evenly between each of the two y's.This leads to the idea that for every two numbers a and b in a group, for a prime factor pi, either both a and

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值