混合牛奶
题目描述
牛奶包装是一个如此低利润的生意,所以尽可能低的控制初级产品(牛奶)的价格变的十分重要。请帮助快乐的牛奶制造者(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 一天能卖给快乐的牛奶制造者的牛奶数量
输出
单独的一行包含单独的一个整数,表示快乐的牛奶制造者拿到所需的牛奶所要的最小费用
样例输入
100 5
5 20
9 40
3 10
8 80
6 30
样例输出
630
一个贪心问题,把价格排序,再计算最优解,算可以拆分的背包问题。
#include<stdio.h>
struct AP
{
int Ai;
int Pi;
}num[5000],temp;
int main()
{
int N,M,i,j;
long long int sum=0,k=0;
scanf("%d %d",&N,&M);
for(i=0;i<M;i++)
scanf("%d %d",&num[i].Pi,&num[i].Ai);
for(i=0;i<M-1;i++)
for(j=0;j<M-1-i;j++)
if(num[j].Pi>num[j+1].Pi)
{
temp=num[j];
num[j]=num[j+1];
num[j+1]=temp;
}//用冒泡对价格进行排序
for(i=0;i<M;i++)
{
if(k+num[i].Ai<N)//确保数量不会超过所需
{
sum+=num[i].Ai*num[i].Pi;
k+=num[i].Ai;
}
else
break;
}
sum+=(N-k)*num[i].Pi;//加上剩余所需的价格
printf("%lld",sum);
}
0-1背包问题
给定一个载重量为M的背包,考虑n个物品,其中第i个物品的质量为wi,价值为vi(1<=i<=n),要求把物品装满背包,且使背包内物品价值最大。物品不能被拆分。
动态规划算法
#define NUM 50
#define CAP 1500
int w[NUM];
int v[NUM];
int p[NUM][CAP];//用于递归的数组
int max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
int min(int x,int y)
{
if(x>y)
return y;
else
return x;
}
void fun(int c,int n)//c是背包的容量w,n是物品的数量
{
int jmax=min(w[n]-1,c);//分界点
for(int j=0;j<=jmax;j++)
p[n][j]=0;
for(int j=w[n];j<=c;j++)
p[n][j]=v[n];
for(int i=n-1;i>1;i--)//计算递推式
{
jmax=min(w[n]-1,c);
for(int j=0;j<=jmax;j++)
p[i][j]=p[i+1][j];
for(int j=w[i];j<=c;j++)
p[i][j]=max(p[i+1][j],p[i+1][j-w[i]]+v[i]);
}
p[1][c]=p[2][c];//计算最优值
if(c>=w[1])
p[1][c]=max(p[1][c],p[2][c-w[1]]+v[1]);
}
最优解
void fun(int c,int n,int x[])
{
for(int i=0;i<n;i++)
{
if(p[i][c]==p[i+1][c])
x[i]=0;
else
{
x[i]=1;c-=w[i];
}
}
x[n]=(p[n][c])?1:0;
}
守门人的日常
题目描述
实验室的财产安全很重要,所以 , 坐在门口的大廖就负责登记一天的出入情况。
现给你一天的登记情况 ,试找出第一个进入的 id 和最后一个出去的 id。
输入
一次包含一组数据。
第1行为进入的人的个数 m
第2行到第m+1行为记录的情况
记录的格式如下 :ID_number Sign_in_time Sign_out_time
输出
输出第一个进入的 id , 和最后一个出去的 id
样例输入
3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40
样例输出
SC3021234 CS301133
用结构体之后显得简洁明了,可以直接计算总时间为秒,再进行比较即可。
#include<stdio.h>
struct person
{
char ID[100];
char time1[100];
char time2[100];
}num[100];
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s %s %s",&num[i].ID,&num[i].time1,&num[i].time2);
int a[100],b[100],HH1,MM1,SS1,HH2,MM2,SS2,min=0,max=0;
for(i=0;i<n;i++)
{
HH1=(num[i].time1[0]-'0')*10+num[i].time1[1];
MM1=(num[i].time1[4]-'0')*10+num[i].time1[5];
SS1=(num[i].time1[7]-'0')*10+num[i].time1[8];
HH2=(num[i].time2[0]-'0')*10+num[i].time2[1];
MM2=(num[i].time2[4]-'0')*10+num[i].time2[5];
SS2=(num[i].time2[7]-'0')*10+num[i].time2[8];
a[i]=HH1*3600+MM1*60+SS1;
b[i]=HH2*3600+MM2*60+SS2;
}
for(i=0;i<n;i++)
{
if(a[i]<a[min])
min=i;
if(b[i]>b[max])
max=i;
}
printf("%s %s",num[min].ID,num[max].ID);
}
小叶子学英文
题目描述
小叶子现有一个非负整数n,它的任务是计算 n 的各位数的和 , 并且按英语输出总和中的每一个数字。
输入
每次一个整数n,n<=10^100
输出
按要求输出
题目很简单,就是要注意选择用字符数组输入,因为数据较大,数组存不下
#include<stdio.h>
#include<string.h>
int main()
{
char n[100];
scanf("%s",n);
long long int l,b[1000],i,j,k,sum=0;
l=strlen(n);
for(i=0;i<l;i++)
sum+=(n[i]-48);
for(j=0;;j++)
{
b[j]=sum%10;
sum=sum/10;
if(sum==0)
break;
}//用数组b记录和的各个位数
for(k=j;k>=0;k--)
{
if(b[k]==0)
printf("zero\t");
if(b[k]==1)
printf("one\t");
if(b[k]==2)
printf("two\t");
if(b[k]==3)
printf("three\t");
if(b[k]==4)
printf("four\t");
if(b[k]==5)
printf("five\t");
if(b[k]==6)
printf("six\t");
if(b[k]==7)
printf("seven\t");
if(b[k]==8)
printf("eight\t");
if(b[k]==9)
printf("nine\t");
}
}
丑数
题目描述
我们把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。输入一个数n,判断它是否是丑数。是丑数输出YES,不是丑数输出NO。
输入
输入n:
6
输出
输出:
YES
比较简单诶,循环嵌套都没有时间超限耶。
#include<stdio.h>
int main()
{
long long int n;
scanf("%lld",&n);
int i,k=0,flag=1;
int a[100];
while(1)
{
while(n%2==0)
{n/=2;}
while(n%3==0)
{n/=3;}
while(n%5==0)
{n/=5;}
if(n==1){printf("YES");break;}
else {printf("NO");break;}
}
}