2020年百度之星 程序设计大赛 初赛一

大家好,我是小黄呀
@Time : 2020-07-19 14:00:00 - 17:00:00
@Host : HDOJ

题目传送门

太菜了啊,三题就是极限了。。。

Drink

1001-题目

题目大意

有n种不同的饮料,第i种饮料提供x[i]的水份,包含y[i]的卡路里,只能选择一种饮料一直喝,现在需要至少m毫升的水份,求出摄入的卡路里总和最小的饮料。并且一旦打开一瓶饮料,就要喝完。

思路分析(暴力)

  1. 直接对所有饮料进行遍历,求出每一种饮料满足m毫升水份,所摄入的卡路里cnt2,然后求出最小值。
  2. 由于打开一瓶饮料,必须喝完,所以在求饮料瓶数是,要向上取整,用一个ceil函数。

具体代码

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int t;
    cin>>t;
    for(int i=0;i<t;i++)
    {
        int n,m;
        cin>>n>>m;
        int ans=100001;
        for(int j=0;j<n;j++)
        {
            int x,y;
            cin>>x>>y;
            int cnt1=ceil(m/(x*1.0));
            int cnt2=cnt1*y;
            if(cnt2<ans)
            {
                ans=cnt2;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

GPA

1002-题目

题目大意

4门考试,每门考试满分100,最低0分,题目中给出了成绩与绩点的对应关系,现在给出4门考试的总分,求出绩点的和最大是多少

思路分析(参照大佬)

  1. 用一个map<int,int> 来保存分数与绩点的对应关系,此处并将绩点*10,方便计算,最后再/10.,输出一位小数
  2. 用四个循环对四门课分数进行遍历,求出在给定总分下,绩点的最大值。这里用到了for(auto x:mp),用来简化代码的。(大佬就是不一样)

具体代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long

map<int,int>mp;

void init(){
    mp[95]=43;
    mp[90]=40;
    mp[85]=37;
    mp[80]=33;
    mp[75]=30;
    mp[70]=27;
    mp[67]=23;
    mp[65]=20;
    mp[62]=17;
    mp[60]=10;
    mp[0]=0;
}

#define fi first
#define se second

int T, n, ans;

int main(){
    init();
    for (cin>>T;T--;){
        cin>>n;
        ans=0;
        for (auto a:mp)
            for (auto b:mp)
                for (auto c:mp)
                    for (auto d:mp)
                        if (a.fi+b.fi+c.fi+d.fi<=n)
                            ans=max(ans,a.se+b.se+c.se+d.se);
        printf("%.1lf\n",ans/10.);
    }
}

Dec

1003-题目

题目大意

给定a,b两个正整数,每次从中选一个大于1的数减1,直到两个数都为1,求出在整个过程中两个数互质的次数最多是多少。

思路分析

  1. 逆向思维,直接打表,定义一个二维数组f[i][j],然后从1开始,直到给定的最大范围1000,求出i,j两个整数在题目要求过程中最大互质次数,保存在f[i][j]中。
  2. 其中判断两数互质,用到__gcd(m,n)函数。
  3. 输入a,b,输出f[a][b]

具体代码

#include<bits/stdc++.h>
using namespace std;


int n, f[1010][1010];

int main(){
    n=1000;
    for (int i=1;i<=n;++i)
        for (int j=1;j<=n;++j){
            f[i][j]=max(f[i][j-1],f[i-1][j])+(__gcd(i,j)==1);
        }
    int T, a, b;
    for (cin>>T;T--;){
        scanf("%d%d",&a,&b);
        printf("%d\n",f[a][b]);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_AoSnow_

创作不易,打赏打赏些8

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值