第一题:小谭吃东西。
题目描述
话说我们家小谭啊,他特别的好吃懒做,对于吃还很挑剔,有一天他得到了一堆的饮料,他就想要喝掉这些饮料,但是他喝饮料有个特殊的习惯,那就是不喜欢连续两次喝相同的饮料,小谭不知道是否存在一种喝饮料的顺序使得他能够喝完所有的饮料,所以他请你帮他写个程序来测一测。
输入
多组输入
每组第一行输入一个n ( 0 < n <= 10 ) 代表饮料的种类数量,接下来的一行有n个数,代表每种饮料的数量 p(p < 1e9 )
输出
如果存在一种喝饮料的顺序能够使小谭喝完所有的饮料就输出 yes 否则输出 no
样例输入
3 4 1 1 5 5 4 3 2 1
样例输出
no yes
分析
1.这个题目是一个思维题,在排列组合里面有一种方法,叫做插空法。
2.利用这个思维,我们很容易的知道我们只要拿出最大相同的饮料数-1和剩下饮料的总和比较,如果剩下的饮料能够大于最大饮料数-1即可。
3.比如样例中我们只需要填充最大的饮料数,就是从5中间隔开的,其他肯定不会是相同
代码如下:
#include<stdio.h>
int main()
{
double sum,max;
long long n,a[15],i,j;
while(~scanf("%lld",&n))
{
sum=0;
max=0;
for(i=0; i<n; i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
if(max<a[i]) max=a[i];
}
if((sum-max)>=max-1) printf("yes\n");
else printf("no\n");
}
return 0;
}
第二题:黑黑的小叶子
题目描述
从前有一个小叶子,他很黑,非常黑,但自从来了学校后,由于天天宅,竟按一定比率慢慢变白了。现给出小叶子的黑化程度n和变白比率v,求m天后小叶子的黑化程度。
输入
第一行给出黑化程度n,第二行给出天数m和变白比率v
输出
输出黑化度(保留一位小数)
样例输入
3 1 0.3
样例输出
2.1
分析
其实就是简单的数学题,要找准其中的数学关系,比如样例即小叶子他一天可以变白3*0.3;黑化程度为3-3*0.3;不要想得太复杂;
代码如下:
#include<stdio.h>
#include<math.h>
int main()
{
float n,m;
float v,i;
scanf("%f",&n);
scanf("%f %f",&m,&v);
for(i=0;i<m;i++)
{
n=n-n*v;
}
printf("%.1f\n",n);
return 0;
}
第三题:周老师的区间问题
题目描述
周老师无聊时乱写了 n 个区间,但处女座的他随后又想将 n 个区间整理合并,但他发现区间太多了,于是他想请你帮帮他
输入
每次测试输入多组数据(小于100组),对于每组输入数据:
第一行为 n ,代表 n 个区间
接下来 n 行,每行两个数 s , t 代表区间 [s,t]
0 < n < 15000
0 <= s <= t < 10000000
输出
第一行输出一个数字 q ,代表合并后剩余的区间个数
随后 q 行 按从小到大的顺序输出区间
样例输入
3 2 4 1 3 7 7
样例输出
2 1 4 7 7
分析
这题实际就是找区间之间的包含关系,可以先将他们右端点进行排序,然后比较左端点,若第一个区间的左端点小于右端点则两者有交集,可以进行合并,若第一个区间的左端点大于第二个区间的左端点但小于第二个区间的右端点那么第二个区间实际就是完全包含第一个区间的,则第一个区间完全可以删除,若第一个区间的左端点大于第二个区间的右端点则两者之间无关系,不用进行合并处理。
代码如下:
#include<stdio.h>
void qsort(long long int a[],long long int x,long long int y)
{
long long int i,j,t,temp;
if(x>y)
return ;
temp=a[x];
i=x;
j=y;
while(i!=j)
{
while(a[j]>=temp&&i<j)
j--;
while(a[i]<=temp&&i<j)
i++;
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[x]=a[i];
a[i]=temp;
qsort(a,x,i-1);
qsort(a,i+1,y);
return ;
}
int main()
{
long long int n,left[15000],right[15000],i,j;
while(~scanf("%lld",&n))
{
for(i=0; i<n; i++)
scanf("%lld %lld",&left[i],&right[i]);
qsort(left,0,n-1);
qsort(right,0,n-1);
j=0;
for(i=1; i<n; i++)
{
if(left[i]<=right[j])
{
if(right[j]<=right[i])
right[j]=right[i];
continue;
}
else
{
j++;
left[j]=left[i];
right[j]=right[i];
}
}
printf("%lld\n",j+1);
for(i=0; i<=j; i++)
printf("%lld %lld\n",left[i],right[i]);
}
}
第四题:兔子的谎言
题目描述
有四只兔子,年龄从1岁到4岁各不相同.
它们中有两只说话了,无论谁说话,如果说的是关于比它大的兔子的话都是假话,说比它小的兔子的话都是真话.
兔子甲说:“兔子乙3岁.”
兔子丙说:“兔子甲不是1岁.”
你知道这四只兔子分别是几岁吗?
输入
本题无输入,按提示的格式输出即可(样例的答案不是正确答案)!
输出
甲:1岁
乙:2岁
丙:3岁
丁:4岁
分析
思维题
利用假设法
首先假设均为真,则丙比甲大,乙为3,甲不为1,甲比乙大矛盾;
甲为假,丙为真,则乙不为3,甲不为1,甲比乙小,甲比丙小,可得甲=2,乙=4,丙=3,丁=1;
注:填写答案时按照格式,冒号用中文版,不要用英文。
代码如下:
#include<stdio.h>
int main()
{
printf("甲:2岁\n");
printf("乙:4岁\n");
printf("丙:3岁\n");
printf("丁:1岁\n");
return 0;
}
第五题:小兔子的果园
题目描述
小兔子有n个果园,果园里有许多果树,有苹果树,芒果树,香蕉树,李子树,无花果树。
终于到了丰收的季节,小兔子从每个果园采了许多的水果,现在小兔子想给每个果园的产量排序。
因为小兔子爱吃芒果,所以按芒果的数量从大到小排序,如果芒果的数量相同,那就按照其他水果的总数量从小到大排序。
不会存在芒果数量相同且其他水果的总数量相同的情况。
输入
第一行输入一个n,代表n个果园(1<=n<=10)
接下来n行,每行五个数,分别代表小兔子从果园里采摘的苹果数量,芒果数量,香蕉数量,李子数量,无花果数量
每个水果的数量不超过10,且没有负数。
输出
输出n个果园产量排序后的结果
样例输入
5 1 2 3 4 5 1 3 3 4 5 1 4 2 2 2 1 1 1 1 1 1 4 1 1 1
样例输出
1 4 1 1 1 1 4 2 2 2 1 3 3 4 5 1 2 3 4 5 1 1 1 1 1
分析
利用结构体求解;
先按芒果的数量从大到小排序,如果芒果的数量相同,那就按照其他水果的总数量从小到大排序
代码如下:
#include<stdio.h>
struct tree
{
int a;//苹果
int b;//芒果
int c;//香蕉
int d;//李子
int e;//无花果
};
int main()
{
struct tree s[100],t;
int n,i,j,flag=0,g[100]={0},k=0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d %d %d %d %d",&s[i].a,&s[i].b,&s[i].c,&s[i].d,&s[i].e);
g[i]=s[i].a+s[i].b+s[i].c+s[i].d+s[i].e;
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(s[j].b<s[j+1].b)
{
for(k=0;k<n;k++)
{
t=s[j];
s[j]=s[j+1];
s[j+1]=t;
}
}
if(s[j].b==s[j+1].b&&g[j]<g[j+1])
{
for(k=0;k<n;k++)
{
t=s[j];
s[j]=s[j+1];
s[j+1]=t;
}
}
}
}
for(i=0; i<n; i++)
{
printf("%d %d %d %d %d\n",s[i].a,s[i].b,s[i].c,s[i].d,s[i].e);
}
return 0;
}