目录:
1.混和牛奶
2.小兔子的果园
3.小叶子学英文
混和牛奶
描述
牛奶包装是一个如此低利润的生意,所以尽可能低的控制初级产品(牛奶)的价格变的十分重要。请帮助快乐的牛奶制造者(Merry Milk Makers)以可能的最廉价的方式取得他们所需的牛奶。快乐的牛奶制造公司从一些农民那购买牛奶,每个农民卖给牛奶制造公司的价格不一定相同。而且,如一只母牛一天只能生产一定量的牛奶,农民每一天只有一定量的牛奶可以卖。每天,快乐的牛奶制造者从每个农民那购买一定量的牛奶,少于或等于农民所能提供的最大值。给出快乐牛奶制造者的每日的牛奶需求,连同每个农民的可提供的牛奶量和每加仑的价格,请计算快乐的牛奶制造者所要付出钱的最小值。注意: 每天农民生产的牛奶的总数对快乐的牛奶制造者来说足够的。
格式
输入格式
第 1 行:二个整数, N 和 M。第一个数值,N,(0<= N<=2,000,000)是快乐的牛奶制造者的一天需要牛奶的数量。第二个数值,M,(0<= M<=5,000)是他们可能从农民那买到的数目。第 2 到 M+1 行:每行二个整数,Pi 和 Ai。 Pi(0<= Pi<=1,000) 是农民 i 牛奶的价格。 Ai(0 <= Ai <= 2,000,000)是农民 i 一天能卖给快乐的牛奶制造者的牛奶数量。
输出格式
单独的一行包含单独的一个整数,表示快乐的牛奶制造者拿到所需的牛奶所要的最小费用
样例
样例输入 Copy
100 5
5 20
9 40
3 10
8 80
6 30
样例输出 Copy
630
大概思路:求最小费用,所以可以先进行排序再来选择牛奶,
按照价格高低从低到高进行排序(快排、冒泡、选择都行)
求和时要考虑是否超过所需量。
代码:
#include<stdio.h>
struct node{
int p;
int s;
};
struct node a[10000];//定义a数组
void quicksort(int left,int right)//快排
{
int i,j,t,temp,h;
if(left>right)
return;
temp=a[left].p;
h=a[left].s;
i=left;
j=right;
while(i!=j)
{
while(a[j].p>=temp&&i<j)
j--;
while(a[i].p<=temp&&i<j)
i++;
if(i<j)
{
t=a[i].p;
a[i].p=a[j].p;
a[j].p=t;
t=a[i].s;
a[i].s=a[j].s;
a[j].s=t;
}
}
a[left].p=a[i].p;
a[i].p=temp;
a[left].s=a[i].s;
a[i].s=h;
quicksort(left,i-1);
quicksort(i+1,right);
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d %d",&a[i].p,&a[i].s);//输入数据
}
quicksort(1,m);
int sum=0;
int z=0;
for(int i=1;i<=m;i++)
{
z+=a[i].s;
sum+=(a[i].p*a[i].s);//求和
if(z>n)
{
sum-=((z-n)*a[i].p);//超过n的部分减去
break;
}
}
printf("%d",sum);
}
小兔子的果园
描述
小兔子有n个果园,果园里有许多果树,有苹果树,芒果树,香蕉树,李子树,无花果树。
终于到了丰收的季节,小兔子从每个果园采了许多的水果,现在小兔子想给每个果园的产量排序。
因为小兔子爱吃芒果,所以按芒果的数量从大到小排序,如果芒果的数量相同,那就按照其他水果的总数量从小到大排序。
不会存在芒果数量相同且其他水果的总数量相同的情况。
格式
输入格式
第一行输入一个n,代表n个果园(1<=n<=10)
接下来n行,每行五个数,分别代表小兔子从果园里采摘的苹果数量,芒果数量,香蕉数量,李子数量,无花果数量
每个水果的数量不超过10,且没有负数。
输出格式
输出n个果园产量排序后的结果
样例
样例输入 Copy
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
样例输出 Copy
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 node{
int a,b,c,d,e;
};//结构体
struct node f[10000];
struct node g[10000]; //用于交换的空数组,与 {t=a;a=b;b=t;}的作用相同
int main()
{
int n,t;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d %d %d %d",&f[i].a,&f[i].b,&f[i].c,&f[i].d,&f[i].e);
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(f[j].b>f[j+1].b)//比较芒果的数量
{
g[j]=f[j];
f[j]=f[j+1];
f[j+1]=g[j];
}
if(f[j].b==f[j+1].b)//芒果树量相等时比较其他水果和的数量
{
if(f[j].a+f[j].c+f[j].d+f[j].e<f[j+1].a+f[j+1].c+f[j+1].d+f[j+1].e)
{
g[j]=f[j];
f[j]=f[j+1];
f[j+1]=g[j];
}
}
}
}
for(int i=n-1;i>=0;i--){//运用冒泡排序从小到大,所以反向输出
printf("%d %d %d %d %d",f[i].a,f[i].b,f[i].c,f[i].d,f[i].e);
printf("\n");
}
}
小叶子学英文
描述
小叶子现有一个非负整数n,它的任务是计算 n 的各位数的和 , 并且按英语输出总和中的每一个数字。
格式
输入格式
每次一个整数n,n<=10^100
输出格式
按要求输出。
样例
样例输入 Copy
12345
样例输出 Copy
one five
思路:用字符数组输出,用数组或字符数组来接收和,注意进位,字符需-‘0’在进行相加。
代码:
#include<stdio.h>
#include<string.h>
int b[10000000]; //用于接收
char a[10000000];
int main()
{
gets(a);
int n=strlen(a);
int sum=0;
int g=0;
for(int i=0;i<n;i++)
{
b[0]=b[0]+a[i]-'0';
int t=0;
while(b[t]>=10) //当和大于10,进位
{
b[t+1]++;
b[t]%=10;
t++;
if(t>=g)
g=t; //判断数组长度
}
}
for(int i=g;i>=0;i--)
{
if(b[i]==1)
printf("one ");
else
if(b[i]==2)
printf("two ");
else
if(b[i]==3)
printf("three ");
else
if(b[i]==4)
printf("four ");
else
if(b[i]==5)
printf("five ");
else
if(b[i]==6)
printf("six ");
else
if(b[i]==7)
printf("seven ");
else
if(b[i]==8)
printf("eight ");
else
if(b[i]==9)
printf("nine ");
else
if(b[i]==0)
printf("zero ");
}
}
总结:今天巩固了结构体,快排,字符串知识,总体收获还行。