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;
}
因为时环形的圈,如果正向的距离过长,我们只需用总长度减去正向距离的长度即可,不会出现超时的问题