一: 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}
2∗n3∗(sum+x),而我们要取得的数是不小于m的,即x<=m,整理得:x<=
2
∗
s
u
m
3
∗
n
−
2
\frac{2*sum}{3*n-2}
3∗n−22∗sum;然后是胜率,我们只需要知道这个数有多少人选过就可以了,用一个数组统计人数就可以了。
#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;
}