训练补题0327

前言:

好久没写了,最近训练也很不在状态,想调整一下好好准备比赛啊,开始补题做记录,以后方便复习,也是自我监督。

0327校队蓝桥杯积分训练赛补题记录

A:

A题面.png
思路:

1、小于n的数中是m的倍数一共有n/m个
2、如果a和b都是k因数,用在思路1中会重复减去。

代码:
#include
using namespace std;
int main(){
    long long n;
    cin>>n;
    cout<
心得:

训练的时候其实想出来了,但一直没过,心态就不稳了,赛后检查的时候才发现思路是对的,排列组合的时候少了一个数,我是大笨蛋。

B:

签到题 但全英的训练时候就没看 555后悔 略了哈巨简单

C:

C题面.png
思路:

最小生成树模板题

代码:
#include
#include
using namespace std;
int f[100005];
struct node{
    int l,r,v;
}a[100005];
int Find(int x){
    if(f[x]!=x)
        return f[x]=Find(f[x]);
    else
        return x;
}
bool cmp(node aa,node bb){
    return aa.v>n>>m;
    for(int i=1;i<=n;i++)
        f[i]=i;
    for(int i=1;i<=m;i++)
        scanf("%d %d %d",&a[i].l,&a[i].r,&a[i].v);
    sort(a+1,a+1+m,cmp);
    for(int i=1;i<=m;i++){
        int p=Find(a[i].l);
        int q=Find(a[i].r);
        if(p==q)
            continue;
        else{
            f[p]=q;
            ans=ans+(long long)a[i].v;
        }
    }
    cout<
心得:

好好学图论吧

D:

D题面.png
思路:

1、字典序输出,排列前先排序
2、会有重复字符出现,建议使用next_permutation()函数 详情参考:大佬博客

代码:
#include
#include
#include
using namespace std;
int main(){
    string s;
    cin>>s;
    s=s.substr(0,s.length()-1);
    sort(s.begin(),s.end());
    int k=0;
    do{
        if(k==0)
            cout<
心得:

终于学会全排列了 结果还有升级版 55hh55hh 我人傻了 比赛的时候WA了4发 脑袋开始不清楚了

E:

E题面.png
思路:

题意:给n个星星,每个星星按y坐标从小到大,y一样x从小到大输入,然后每个星星的左下区域每包含一个星星(不包括自己),该星星就升一级;最后求等级0~n-1的星星的个数。树状数组模板题

代码:
#include
#include
using namespace std;
int n;
int a[100005]; //保存等级
int c[100005]; //从当前元素开始连续往左求lowbit(x)个数的和
int lowbit(int x){
    return x&(-x);
}
int ask(int x){
    int ans=0;
    while(x>0){
        ans+=c[x];
        x-=lowbit(x);
    }
    return ans;
}
void add(int x){
    while(x<=32005){
        c[x]+=1;
        x+=lowbit(x);
    }
    return;
}
int main(){
    while(~scanf("%d",&n)){
        memset(c,0,sizeof(c));
        memset(a,0,sizeof(a));
        int x,y;
        for(int i=1;i<=n;i++){
            scanf("%d %d",&x,&y);
            a[ask(x+1)]++;
            add(x+1);
        }
        for(int i=0;i
心得:

awsl

F:

F题面.png
思路:

开始就是动态规划 不过要输出 就要标记一下
大佬思路(网图).png
代码:
#include
#include
#include
using namespace std;
char a[1005];
char b[1005];
int dp[1005][1005];
int flag[1005][1005];
void write(int i,int j){
    if(i==0||j==0)
        return ;
    if(flag[i][j]==0){
        write(i-1,j-1);
        cout<>a>>b;
    for(int i=1;i<=strlen(a);i++){
        for(int j=1;j<=strlen(b);j++){
            if(a[i-1]==b[j-1]){
                dp[i][j]=dp[i-1][j-1]+1;
                flag[i][j]=0;
            }else if(dp[i-1][j]>=dp[i][j-1]){
                dp[i][j]=dp[i-1][j];
                flag[i][j]=1;
            }else{
                dp[i][j]=dp[i][j-1];
                flag[i][j]=-1;
            }   
        }
    }   
    write(strlen(a),strlen(b));
    return 0;
}
心得:

“我太菜”这句话我已经说累了

G:

G题面.png
思路:

语法题 mark一下吧 天哥的代码感觉好精简

代码:
#include
using namespace std;
int a[1005][1005];
int main(){
    ios::sync_with_stdio(0);
    int n;
    cin>>n;
    int x=1,y=n,k=1;
    a[x][y]=1;
    while(k=1&&a[x][y-1]==0)a[x][--y]=++k;
        while(x-1>=1&&a[x-1][y]==0)a[--x][y]=++k;
        while(y+1<=n&&a[x][y+1]==0)a[x][++y]=++k;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cout<
心得:

比赛心态很重要呀

H:

H题面.png
思路:

用数组的下标代表原字母 对应数组的值代表替代后的字母

代码:
#include
using namespace std;
char a[30];
int main(){
    int n,m;
    string s;
    cin>>n>>m>>s;
    for(int i=0;i<26;i++)
        a[i]=char('a'+i);
    for(int i=1;i<=m;i++){
        char x,y;
        cin>>x>>y;
        for(int i=0;i<26;i++){
            if(a[i]==x){
                a[i]=y;
                continue;
            }
            if(a[i]==y){
                a[i]=x;
                continue;
            }
        }
    }
    for(int i=0;i
心得:

天哥太强了

你可能感兴趣的:(训练补题0327)