在一个舞会上,有男队(m人)和女队(n人)两个队伍,并分别为两个队的成员依次进行编号,问:有x号男生和y号女生会在这场舞会中第几首曲子共舞?
输入四个整数m,n,x,y,分别表示男队人数,女
队人数,x号男生,y号女生
输出一个整数,x号男生会和y号女生在第几首曲子共舞。
#include <stdio.h>
int main() {
int m, n, x, y, res;
scanf("%d %d %d %d", &m, &n, &x, &y);
res = (x - 1) * n + y;
printf("%d", res);
return 0;
}
这个问题的思路是,首先用一个循环队列来存储男生和女生的编号,然后每次从队头取出一个男生和一个女生,计算他们的共舞曲目,如果两个队列都不为空,就继续这个过程,直到有一个队列为空为止。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 //定义队列的最大容量
typedef struct {
int data[MAXSIZE]; //用数组存储队列元素
int front; //队头指针
int rear; //队尾指针
} Queue;
//初始化队列
void InitQueue(Queue *Q) {
Q->front = Q->rear = 0; //队头和队尾都指向0
}
//判断队列是否为空
int IsEmpty(Queue Q) {
return Q.front == Q.rear; //如果队头和队尾相等,说明队列为空
}
//判断队列是否已满
int IsFull(Queue Q) {
return (Q.rear + 1) % MAXSIZE == Q.front; //如果队尾加1后取模等于队头,说明队列已满
}
//入队操作
void EnQueue(Queue *Q, int x) {
if (IsFull(*Q)) { //如果队列已满,打印错误信息并退出
printf("Queue is full!\n");
exit(1);
}
Q->data[Q->rear] = x; //将元素x存入队尾位置
Q->rear = (Q->rear + 1) % MAXSIZE; //更新队尾指针
}
//出队操作
int DeQueue(Queue *Q) {
int x;
if (IsEmpty(*Q)) { //如果队列为空,打印错误信息并退出
printf("Queue is empty!\n");
exit(1);
}
x = Q->data[Q->front]; //取出队头元素
Q->front = (Q->front + 1) % MAXSIZE; //更新队头指针
return x; //返回出队元素
}
//计算共舞曲目的函数
int Dance(int m, int n, int x, int y) {
Queue male, female; //定义男生和女生的队列
int i, j, k, count;
InitQueue(&male); //初始化男生队列
InitQueue(&female); //初始化女生队列
for (i = 1; i <= m; i++) { //将男生编号依次入男生队列
EnQueue(&male, i);
}
for (j = 1; j <= n; j++) { //将女生编号依次入女生队列
EnQueue(&female, j);
}
count = 0; //初始化共舞曲目计数器
while (!IsEmpty(male) && !IsEmpty(female)) { //当两个队列都不为空时,循环进行配对
i = DeQueue(&male); //取出一个男生编号
j = DeQueue(&female); //取出一个女生编号
count++; //共舞曲目加一
if (i == x && j == y) { //如果是目标男生和女生,返回共舞曲目数
return count;
}
k = rand() % 2; //随机生成0或1
if (k == 0) { //如果是0,表示男生想再跳一曲,将他重新入男生队列
EnQueue(&male, i);
}
k = rand() % 2; //再次随机生成0或1
if (k == 0) { //如果是0,表示女生想再跳一曲,将她重新入女生队列
EnQueue(&female, j);
}
}
return -1; //如果两个队列中有一个为空,说明没有找到目标男生和女生的配对,返回-1
}
//主函数
int main() {
int m, n, x, y, result;
printf("请输入男生人数和女生人数:\n");
scanf("%d%d", &m, &n);
printf("请输入目标男生编号和女生编号:\n");
scanf("%d%d", &x, &y);
result = Dance(m, n, x, y); //调用共舞曲目函数
if (result == -1) { //如果返回-1,表示没有找到配对
printf("没有找到目标男生和女生的配对。\n");
} else { //否则,打印共舞曲目数
printf("目标男生和女生会在第%d首曲子共舞。\n", result);
}
return 0;
}
题目要求:
已知男人每人每次搬3块,女人每人每次搬2块,小孩两人每次抬一块
现有45人一次正好搬完全部砖块,请问男人、女人、小孩各几人?
#include <stdio.h>
int main()
{
int w,m,s,d=0;
for(m=0;m<=15;m++)
{
for(w=0;w<=22;w++)
{
s= 45-m-w;
if(m*3+w*2+s*0.5==45)
{
d++;
printf("%d、\n",d);
printf("man:%d\nwoman:%d\nstudent:%d\n\n",m,w,s);
}
}
}
return 0;
}