12.28总结

混合牛奶

题目描述

牛奶包装是一个如此低利润的生意,所以尽可能低的控制初级产品(牛奶)的价格变的十分重要。请帮助快乐的牛奶制造者(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;}
 
    }
 
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值