acm第7次

文章讨论了三个编程问题:交换数列中的奇偶性操作、模拟攻击计算英雄伤害和判断数组安全牌的变化,以及利用质因数分解验证数组独立性。

A困难的交换数

(纯签到题)

题解:

        如果第一个元素是奇数,那么无需操作,输出 0 。

        如果第一个元素是偶数,且后面有元素比它小,且是奇数,输出 1 。

        否则,输出 -1 。

代码实现:

#include<stdio.h>

int num[110];

int main(){

    int t;

    scanf("%d",&t);

    while(t--){

        int n;

        scanf("%d",&n);

        int f=0;

        for(int i=1;i<=n;i++){

            scanf("%d",&num[i]);

        }

        if(num[1]&1){

            puts("0");

            continue;

        }

        for(int i=2;i<=n;i++){

            if(num[i]&1&&num[1]>num[i]){

                puts("1");

                f=1;

                break;

            }

        }

        if(!f)puts("-1");

    }

    return 0;

}

C小玩一手炉石传说字

(模拟题,直接写)

题意:

        有n个随从,现进行m次攻击,初始攻击力为2,每次攻击从左至右攻击随从,若恰好击杀随从,则攻击力+1,攻击完随从后再攻击英雄。

        要求输出:英雄受到多少点攻击。

        可能需要注意的就是,敌方随从和对方英雄的区分,注意是求对英雄造成的伤害即可,对随从的伤害无需统计,不要搞混就可以很简单求出结果的。

代码实现:

#include<stdio.h>

int num[110];

int main(){

    int n,m,sum=0,t=2;

    scanf("%d%d",&n,&m);

    for(int i=1;i<=n;i++){

        scanf("%d",&num[i]);

    }

    for(int i=1;i<=m;i++){

        for(int j=1;j<=n;j++){

            if(t==num[j]){

                t++;

                num[j]-=t;

            }else{

                num[j]-=t;

            }

        }

        sum+=t;

    }

    printf("%d",sum);

    return 0;

}

F你会不会打麻将呢?

样例解释:

以及理解0->1 1->0

(思维题+一些优化思维)

题意:  

        m种牌,对手操作q次,拿或者放入数字牌num,num对应的安全牌为num+3/num-3

        问每次操作后有多少种安全牌

题解:

         要用到标记计数。对于每个操作记录安全牌的数量,当安全牌数量从0变1说明种类增加。从1变0说明种类减少。

        主要就是因为从0到1,从1到0会影响安全牌种类count的数目,所以不需要每一次操作后都遍历一遍来统计当时的安全牌数,只需要判断当时是不是造成了从0到1,从1到0即可;其次需要注意的是遍历必然超时,这点略微算一下时间复杂度就可以知道。

代码实现:

 #include<stdio.h>

int st[100010],count;

int main(){

    int m,q;

    scanf("%d %d",&m,&q);

    while(q--){

        int op,x;

        scanf("%d %d",&op,&x);

        if(op==1){

            if(x+3<=m){

                if(st[x+3]==0)count++; st[x+3]++;

            }

            if(x-3>=1){

                if(st[x-3]==0)count++;

                 st[x-3]++;

            }

        }else{

            if(x+3<=m){

                if(st[x+3]==1)count--;

                st[x+3]--;

            }

            if(x-3>=1){

                if(st[x-3]==1)count--;

                st[x-3]--;

            }

        }

        printf("%d\n",count);

    }

    return 0;

}

H防呀防不住_ak

样例解释:以及引入质因数分解思路

(质因数分解)

题解:

       题目要求想知道这两个数组是否是相互独立,还给了个公式定义,又说由两个数组中各选一个数组成的数对的最大公因数是 1,看样子很难。

        其实不难,就是求出a数组和b数组分解质因子后有无重合的项。

        需要用到数组标记第一个数组所有数目出现过的质因子,再看第二个数组的数目质因子是否有重复的,就可以判断是否独立了。

        后续补题,可以去看一下质因数分解的博客,比较重要。

代码实现:

#include<stdio.h>

int mp[1000010],a[100010],b[100010];

int main(){

    int n;

    scanf("%d",&n);

    for(int i=1;i<=n;i++)scanf("%d",&a[i]);

    for(int i=1;i<=n;i++)scanf("%d",&b[i]);

    for(int i=1;i<=n;i++)

    {

        for(int j=2;j<=a[i]/j;j++)

        {

             while(!(a[i]%j))

             {

                mp[j]++;

                a[i]/=j;

            }

        }

        if(a[i]>1) 

        {

             mp[a[i]]++;

        }

    }

    for(int i=1;i<=n;i++)

    {

        for(int j=2;j<=b[i]/j;j++)

        {

             while(!(b[i]%j))

            {

                if(mp[j])

                {

                    puts("No");

                    return 0;

                    }

                else b[i]/=j;

                 }

        }

        if(b[i]>1) 

        {

            if(mp[b[i]])

            {

                puts("No");

                return 0;

            }

        }

        }

    puts("Yes");

     return 0;

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值