每日总结 1.3

今天在补刷题量

题+8

                                   寄邮件

小璐有一群笔友,有一天他们跟小璐约定好去互相寄邮件,每个人只能寄一封邮件,也只能收一封信,寄给这些笔友或者是小璐,小璐也要寄,当然了不能自己寄给自己,那么小璐想知道有多少种不同的寄邮件方式,对于这等问题,小璐早就知道了答案,所以他要来考考你,那么就交给你了。

输入

首先是一个t ,代表有t组测试数据

接下来每一组测试数据输入一个n代表小璐的笔友个数 ( 0 <  t  , n < 20 )

输出

输入每组测试数组的方案数

样例输入 复制

4
1
2
3
4

样例输出 复制

1
2
9
44
#include <stdio.h>
int main()
{
	long long int a[21]={0};
	int t,n,k=1;
	for(int i=1;i<=20;i++)
	{
		a[i]=(i+1)*a[i-1]+k;
		if(i%2==1)
		{
			k=-1;
		}
		else
		{
			k=1;
		}
	}
	scanf("%d",&t);
	for(int i=0;i<t;i++)
	{
		scanf("%d",&n);
		printf("%lld\n",a[n]);
	}
	return 0;
}

寄邮件问题主要难点在于发现规律,相比于搜索枚举都更为简单明了

                                   

                                   萝卜的冒泡排序

题目描述

萝卜上次已经说过要给各位同学出一道冒泡排序,那么此题就以冒泡排序为主吧,可是实验室的学长学姐觉得学弟学妹们都很厉害,所以就加了各种各样的条件,最 终萝卜还是选择加一些条件,比如:让你直接排序输出结果就体现不出冒泡排序了。所以萝卜决定必须要用冒泡排序才能做出来的题目才叫冒泡排序的题目嘛?所以 这里只需要你在使用冒泡排序的时候统计交换的次数,在定义一个规则,如果存在相同的数,那么出现较早的那个数就排在后面。请帮萝卜解决这个问题吧。

输入

只有一组数据。

第一行一个n。(n<100)

接下来有n个数,表示要排序的数(不超过100)。

输出

输出交换的次数。

样例输入 复制

3
1 2 2

样例输出 复制

1

提示

相同的数出现早,即下标小的那个数。

比如样例:

数字1 2 2

下标0 1 2

 

#include<stdio.h>
int main()
{
	int count=0,t,n,a[100],b[100];
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		b[i]=i;
	}
	for(int i=1;i<=n-1;i++)	
	{
		for(int j=1;j<=n-i;j++)
		{
			if(a[j]>a[j+1]||(a[j]==a[j+1]&&b[j]<b[j+1]))
			{
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
				t=b[j];
				b[j]=b[j+1];
				b[j+1]=t;
				count++;
			}
		}
	}
	printf("%d",count);
	return 0;
}

这里用两个数组完美解决先出现的数排在后面的问题,当初被卡在这里,一段时间回来看看发现思路更清楚,写题别心急!!

 

                                   实验室的聚餐

题目描述

实验室的学长学姐要去聚餐,聚餐就要喝酒,可是偏偏大家的酒量都不行,喝一杯就醉。现在大家一起玩个游戏,桌上围坐着2n个人。其中n个人是学长,另外n 个人是学姐。如果从第一个人开始数数,数到第m个人,则让他喝一杯酒,然后他就醉了;然后从喝醉的人之后开始数数,再让数到的第m个人喝酒……依此方法不 断让围坐在桌上的人喝酒。不过,问题来了,学长可以喝醉,但是学姐不能喝醉,所以预先应如何安排这些学长与学姐的座位,能使得在让n个人喝醉之后,桌上围 坐的没醉的n个人全是学姐。

输入

多组数据,每组数据输入:学长和学姐的人数分别为n(n<=3000)、以及m表示数到第m个人就倒下(m<=1000);

输出

对于每一组数据,输出2n个大写字母,‘G’表示学姐,‘B’表示学长,50个字母为一行,不允许出现空白字符。每组测试数据后输出一个空行。

样例输入 复制

2 3
2 4

样例输出 复制

GBBG

BGGB

提示

 请注意格式问题

#include<stdio.h>
int main()
{
	int n,m,temp,sum;
	while(~scanf("%d%d",&n,&m))
	{
		int book[6001]={0};
		temp=0;
		sum=0;
		for(int i=1;sum<n;i++)
		{
			if(i>2*n)
			{
				i=1;
			}
			if(book[i]==1)
			{
				continue;
			}
			temp++;
			if(temp==m)
			{
				temp=0;
				book[i]=1;
				sum++;
			}
		}
		for(int i=1;i<=2*n;i++)
		{
			if(book[i]==1)
			{
				printf("B");
			}
			else
			{
				printf("G");
			}
			if(i%50==0)
			{
				printf("\n");
			}
			if(i==2*n)
			{
				printf("\n\n");
			}
		}
	}
	return 0;
}

这是一题简单的思维题,个人感觉有点像搜索,但是又不太一样,也是需要一个数组来储存是否喝醉

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值