暑假训练(简单题合集二)

一: Solving Order
这里写图片描述
这里写图片描述
这里写图片描述
**题意:**多组输入,每组n组数据,给你气球的颜色和数量,按数量从大到小输出。
**思路:**数据有结构体存储,然后对结构体数组排一下序,别忘记最后的空格。

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
struct stu
{
	int l;
	char col[20];
}x[1000];
bool cmp(struct stu a,struct stu b)
{
	return a.l>b.l;
}
int main()
{
	int t,n;
	cin>>t;
	while(t--)
	{
		memset(x,0,sizeof(x));
		cin>>n;
		for(int i=0;i<n;i++)
		   cin>>x[i].col>>x[i].l;
		sort(x,x+n,cmp); 
		for(int i=0;i<n-1;i++)
		   cout<<x[i].col<<" ";
		cout<<x[n-1].col<<endl;
	}
	return 0;
}

二:Desert

这里写图片描述
**题意:**多组输入,每组一个数代表你有多少水,每天可以喝最少为一且为整数的水,问你有多少种喝水的方法,并转换成二进制输出。
**思路:**题目要求就是把一个整数拆分成多个整数,问有多少种拆法。
解题思路来自:https://blog.csdn.net/queuelovestack/article/details/51525913
对于一个整数n,
如果拆成1份,方案数是C(n-1,0)
如果拆成2份,方案数是C(n-1,1)
如果拆成3份,方案数是C(n-1,2)
。。。。。。
如果拆成n份,方案数是C(n-1,n-1)
对应着二项式展开,它们的和恰好是2^(n-1)。
又因为我们要以二进制的格式输出,在第n位上输出1正好表示2^(n-1),其他位上输出0即可。

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
	int t,n;
	cin>>t;
	for(int i=0;i<t;i++)
	{
		cin>>n;
		cout<<"1";
		for(int i=0;i<n-1;i++)
		   cout<<"0";
		cout<<endl;
	}
	return 0;
}

三:Luck Competition
这里写图片描述
这里写图片描述
**题意:**猜数字游戏,将所有人的数字取平均值k乘以 2 3 \frac{2}{3} 32作为m,取不小m的整数作为幸运数字,不大于幸运数字且最接近的数字获胜。共有n人,你已知其他n-1人的数字,你可以取0到100之间任意整数,使你的胜率最大,输出你选择的数字和胜率。
**思路:**我们已知其他人的数字和sum,设我们取得的数字为x,则k= s u m + x n \frac{sum+x}{n} nsum+x,m= 3 ∗ ( s u m + x ) 2 ∗ n \frac{3*(sum+x)}{2*n} 2n3(sum+x),而我们要取得的数是不小于m的,即x<=m,整理得:x<= 2 ∗ s u m 3 ∗ n − 2 \frac{2*sum}{3*n-2} 3n22sum;然后是胜率,我们只需要知道这个数有多少人选过就可以了,用一个数组统计人数就可以了。

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
int x[110];
int main()
{
	int t,n,a;
	cin>>t;
	while(t--)
	{
		memset(x,0,sizeof(x));
		int k=0;
		cin>>n;
		for(int i=1;i<n;i++)
	    {
	    	cin>>a;
	    	k+=a;
	    	x[a]++;
	    }
	    int ans=(1.0*2*k)/(1.0*(3*n-2));
	    x[ans]++;
	    printf("%d %.2lf\n",ans,1.0/x[ans]);
	}
	return 0;
}

四:GirlCat
这里写图片描述
这里写图片描述
这里写图片描述
**题意:**给你一张n*m个像素的照片,每个像素,都是一个小写英文字母,如果连着走4步,是"girl"就是一个girl;如果连着走3步,是"cat"就是一只cat;求girl和cat的数量。
**思路:**就是在一个二维数组中找有多少满足题意的,因为是连着走3或4步,使用dfs就可以,注意标记和区分。

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char map[1010][1010];
char t1[4]={'g','i','r','l'},t2[3]={'c','a','t'};
int girl,cat,n,m,book[1010][1010];
void dfs(int x,int y,int q,int vis//不同类型的dfs) 
{
	if(x>=n||x<0||y>=m||y<0)
	   return;
	if(!vis) //搜girl 
	{
		if(t1[q]!=map[x][y])   return;
		if(q==3)
	    {
	    	girl++;
	        return;
	    }
 	}
	else if(vis)//搜cat
	{
		if(t2[q]!=map[x][y])   return;
		if(q==2)
		{
			cat++;
			return;
		}
	}
	book[x][y]=1;
	for(int i=0;i<4;i++)
	    dfs(x+d[i][0],y+d[i][1],q+1,vis);
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		memset(book,0,sizeof(book));
		girl=cat=0;
		cin>>n>>m;
		getchar();
		for(int i=0;i<n;i++)
		{
			 for(int j=0;j<m;j++)
		       scanf("%c",&map[i][j]);
		     getchar();
		}
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
				if(!book[i][j])
				{
					if(map[i][j]==t1[0])
					   dfs(i,j,0,0);
					else if(map[i][j]==t2[0])
					   dfs(i,j,0,1);
				}
		cout<<girl<<" "<<cat<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值