复试准备-day5-CCF

1042 Shuffling Machine

洗牌是用于随机化一副扑克牌的过程。由于标准的洗牌技术被认为是薄弱的,并且为了避免员工通过执行不充分的洗牌与赌徒合作的“内部工作”,许多赌场都使用自动洗牌机。你的任务是模拟洗牌机。
机器根据给定的随机顺序洗一副 54 张牌,并重复给定的次数。假设一副牌的初始状态按以下顺序排列:
S1, S2, …, S13,
H1, H2, …, H13,
C1, C2, …, C13,
D1, D2, …, D13,
J1, J2
其中“S”代表“黑桃”,“H”代表“心”,“C”代表“俱乐部”,“D”代表“钻石”,“J”代表“小丑”。给定顺序是 [1, 54] 中不同整数的排列。如果数字在我-th 位置是j,表示将卡从位置移开我到位置j.例如,假设我们只有 5 张牌:S3、H5、C1、D13 和 J2。给定一个洗牌顺序 {4, 2, 5, 3, 1},结果将是:J2, H5, D13, S3, C1。如果我们再次重复洗牌,结果将是:C1、H5、S3、J2、D13。

有很多逻辑上的出错,测试了很多次才找到错误的原因,个人习惯一次性把整个逻辑写完再一块块的检验
检验的在线工具:C在线工具

#include<stdio.h>
int main(){
    int k;
    scanf("%d",&k);//重复的次数
    char card[54];//储存花色
    char card1[54];
    int num1[54];
    int num[54];//储存对应的数字
    int list[54];//记录洗牌的顺序
    
    for(int i=0;i<=3;i++){//初始牌的数字
        for(int j=0;j<13;j++)   num[j+i*13]=j+1;
    }
    num[52]=1;
    num[53]=2;
    
    for(int j=0;j<13;j++)  card[j]='S';//初始牌的花色
    for(int j=13;j<26;j++) card[j]='H';
    for(int j=26;j<39;j++) card[j]='C';
    for(int j=39;j<52;j++) card[j]='D';
    card[52]='J';
    card[53]='J';
    
    for(int i=0;i<54;i++){//洗牌顺序
        getchar();
        scanf("%d",&list[i]);
    }
    
    while(k>0){//交换牌面
        for(int i=0;i<54;i++){
            card1[list[i]-1]=card[i];
            num1[list[i]-1]=num[i];
        }
        for(int i=0;i<54;i++){
            card[i]=card1[i];
            num[i]=num1[i];
        }
        k--;
    }
    
    for(int i=0;i<53;i++){//输出的格式
        printf("%c%d ",card1[i],num1[i]);
    }
    printf("%c%d",card1[53],num1[53]);
    return 0;
}

1046 Shortest Distance-

Given three integers A, B and C in [−263,263], you are supposed to tell whether A+B>C.
Input Specification:
The first line of the input gives the positive number of test cases, T (≤10). Then T test cases follow, each consists of a single line containing three integers A, B and C, separated by single spaces.
Output Specification:
For each test case, output in one line Case #X: true if A+B>C, or Case #X: false otherwise, where X is the case number (starting from 1).

#include<stdio.h>
int main(){
    int n,m;
    int i=0;
    int temp;
    scanf("%d",&n);
    int dist[n];
    int a,b,sum1=0,sum=0;//临时变量
    
    for(int i=0;i<n;i++){//获得循环距离断的长度
        scanf("%d",&dist[i]);
        sum+=dist[i];//统计整个圈的长度
    }
        
    scanf("%d",&m);//测试组的行数
    
    while(m>0){//计算最短距离
        sum1=0;
        scanf("%d %d",&a,&b);
        if(a>b){//看着顺眼a<b
            temp=a;
            a=b;
            b=temp;
        }
        for(int i=a-1;i<b-1;i++) sum1+=dist[i];//正向累积
        if(sum-sum1<sum1) sum1=sum-sum1;
        printf("%d\n",sum1);
        m--;
    }

    return 0;
}

因为时环形的圈,如果正向的距离过长,我们只需用总长度减去正向距离的长度即可,不会出现超时的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值