[Contests]BestCoder Round #87 (1001-1003)

1001 GCD is Funny

思路:

此题真迷;

先两两gcd得出的结果re, f[re]=1;

然后re与除了得出re的父母的其他数gcd

代码:

#include <bits/stdc++.h>
using namespace std;
//不互质返回true
const int N=500+5;
const int M=1000+5;
int a[N];
int f[M];

int gcd(int x, int y){
    return y?gcd(y,x%y):x;
}
int main(){
    int t, n;
    scanf("%d", &t);
    while(t-->0){
        memset(f,0,sizeof(f));
        scanf("%d", &n);
        for(int i=0; i<n; i++)
            scanf("%d", &a[i]);
        sort(a,a+n);
        for(int i=0; i<n-1; i++)
        for(int j=i+1; j<n; j++){
            f[gcd(a[i],a[j])]=1;
        }
        int flag=1, len=n-1;
        while(flag && len>=3){
            len--;
            flag = 0;
            for(int i=1; i<=1000; i++)
            if(f[i]){
                for(int j=0; j<n; j++){
                    int t = gcd(i,a[j]);
                    if(!f[t]){
                        f[t] = 1;
                        flag=1;
                    }
                }
            }
        }
        flag=0;
        for(int i=1; i<=a[n-1]; i++)
        if(f[i]){
            if(flag)
                printf(" ");
            flag=1;
            printf("%d", i);
        }
        printf("\n");
    }
    return 0;
}


1002 Square Distance

思路:

比赛做了很久,怎么就没想出用dp做的呢,只怪自己太vegetable……

整个代码分为两步,让我们先用dp()判断是否可能,不可能就输出"Impossible" (without the quotes),否则按字典序最小的原则改动原数组

f[i][j] 代表从 i 到 (n/2-1) 的 j 代价能否实现,实现赋值1,for: n/2-1 to 0;

代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1000+5;
char arr[N];
int f[N/2][N];//从坐标i往后j代价能否实现,实现为1
int n, m;
int dp(){
    memset(f,0,sizeof(f));
    //注意边界条件
    f[n/2][0] = 1;
    for(int i=n/2-1; i>=0; i--){
        if(arr[i]==arr[i+n/2]){
            for(int j=0; j<=m; j++)
                f[i][j] = f[i+1][j];//不改
            for(int j=0; j<=m-2; j++)
            if(f[i+1][j])
                f[i][j+2] = 1;//改两个
            continue;
        }
        for(int j=0; j<=m-1; j++)
        if(f[i+1][j])
            f[i][j+1] = 1;//改一个
        for(int j=0; j<=m-2; j++)
        if(f[i+1][j])
            f[i][j+2] = 1;//改两个
    }
    if(f[0][m]) return 0;
    return 1;
}
void change(){
    int len=m, tmp;
    for(int i=0; i<n/2; i++)
    for(int j=0; j<26; j++){
        tmp = 0;
        if(arr[i] != j+'a') tmp++;
        if(arr[i+n/2] != j+'a') tmp++;
        if(f[i+1][len-tmp]){
            arr[i] = arr[i+n/2] = j+'a';
            len -= tmp;
            break;
        }
    }
}
int main(){
    int t;
    scanf("%d", &t);
    while(t-->0){
        scanf("%d%d", &n, &m);
        getchar();
        gets(arr);
        //判断是否存在
        if(dp()){
            printf("Impossible\n");
            continue;
        }
        //以字典序最小原则改动原数组
        change();
        puts(arr);
    }
    return 0;
}



1003 LCIS

思路:

一开始被题目迷惑了,LCIS是最长公共子序列,于是我的小伙伴就一直在写LCIS的dp然后TLE然后尝试优化_(:зゝ∠)_

其实这道题是求LIS,两个字符串分别求LIS最长(连续)上升子序列就可以!对,只是需要注意是连续(x,x+1……y-1,y)的就好;

int f[N];//代表以a[i]为结尾的最长【连续】递增序列长度
状态转移方程 f[a[i]] = max{f[a[i]-1]+1, f[a[i]]};

求出来之后for循环找最大值即可

代码:

#include <bits/stdc++.h>
using namespace std;
/*
以a[i]为结尾的最长【连续】递增序列
f[a[i]] = max{f[a[i]-1]+1, f[a[i]]};
*/
#define my_max(x,y) (x>y?x:y)
#define my_min(x,y) (x<y?x:y)
const int N = 1e5+5;
const int M = 1e6+5;
int a[N];
int b[N];
int fa[M];
int fb[M];
int n, m;

void read(){
    //memset(fa,0,sizeof(fa));
    //memset(fb,0,sizeof(fb));
    scanf("%d%d", &n, &m);
    for(int i=0; i<n; i++){
        scanf("%d", &a[i]);
        fa[a[i]] = my_max(fa[a[i]], fa[a[i]-1]+1);
    }
    for(int i=0; i<m; i++){
        scanf("%d", &b[i]);
        fb[b[i]] = my_max(fb[b[i]], fb[b[i]-1]+1);
    }
}
int main(){
    int t;
    scanf("%d", &t);
    while(t-->0){
        read();
        int maxn=0;
        for(int i=0; i<n; i++)
            maxn = my_max(maxn, my_min(fa[a[i]],fb[a[i]]));//有个小陷阱坑了我!!!
        printf("%d\n", maxn);
        //注意fa(fb)里面是a[i](b[i])!!!
        for(int i=0; i<n; i++) fa[a[i]] = 0;
        for(int i=0; i<m; i++) fb[b[i]] = 0;
    }
    return 0;
}

注意:

此题用memset超时,因为他会把数组按长度全部赋值,太慢,如果想用memset,请在代码最最前面加上
#pragma comment(linker, "/STACK:1024000000,1024000000")

反思:

一开始想成f[i]是以 i 为结尾的最长连续递增序列长度,当然就TLE了,做了很多无用功;

附上错误代码,引以为鉴;

#include <bits/stdc++.h>
using namespace std;
/*
以i为结尾的最长【连续】递增序列
f[i] = max{f[i-1]+1, f[i]};
*/
const int N = 1e5;
int a[N];
int b[N];
int fa[N];
int fb[N];
int n, m;

void read(){
    scanf("%d%d", &n, &m);
    for(int i=0; i<n; i++)
        scanf("%d", &a[i]);
    for(int i=0; i<m; i++)
        scanf("%d", &b[i]);
}
void dp(){
    for(int i=0; i<n; i++){
        fa[i] = 1;
        for(int j=0; j<i; j++)
        if(a[i]==a[j]+1 && fa[j]+1>fa[i])
            fa[i] = fa[j]+1;
    }
    for(int i=0; i<m; i++){
        fb[i] = 1;
        for(int j=0; j<i; j++)
        if(b[i]==b[j]+1 && fb[j]+1>fb[i])
            fb[i] = fb[j]+1;
    }
}
int main(){
    int t;
    scanf("%d", &t);
    while(t-->0){
        read();
        dp();
        int maxn=0;
        for(int i=0; i<n; i++)
        for(int j=0; j<m; j++){
            if(fb[j]==fa[i] && b[j]==a[i])
                maxn = maxn>fb[j]?maxn:fb[j];
        }
        printf("%d\n", maxn);
    }
    return 0;
}



基于gcc的stm32环境搭建源码+文档说明.zip,个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕业设计的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的
内容概要:本文档是2017年全国大学生电子设计竞赛的试题,针对单相用电器分析监测装置的设计与制作提出了具体任务和要求。该装置需具备学习和分析监测两种模式,在学习模式下测试并存储电器特征参量,在分析监测模式下实时指示用电器类别和工作状态。基本要求包括电器电流范围、可识别的电器工作状态数、响应时间、最小电流电器的自制等。发挥部分则鼓励提高装置性能,如学习功能优化、增强识别能力、低功耗设计以及无线传输等功能。文档还详细规定了参赛注意事项,如参赛队伍组成、比赛时间安排、纪律要求等,并给出了评分标准,涵盖设计报告、基本要求完成情况及发挥部分的表现; 适合人群:参加全国大学生电子设计竞赛的本科生及高职高专学生,特别是对电子设计、单相用电器监测感兴趣的团队; 使用场景及目标:①作为竞赛指南,帮助参赛队伍明确设计目标和要求;②指导参赛队伍进行单相用电器分析监测装置的设计与制作,确保满足竞赛的基本要求和发挥部分的要求; 其他说明:文档强调了参赛纪律,要求参赛者必须是有正式学籍的全日制在校生,并且在竞赛期间只能在学校指定场地内进行设计制作,不得与他人交流。此外,文档还提供了详细的评分标准,以确保评审过程的公平性和透明度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值