大家好,我是小黄呀
@Time : 2020-07-19 14:00:00 - 17:00:00
@Host : HDOJ
太菜了啊,三题就是极限了。。。
Drink
题目大意
有n种不同的饮料,第i种饮料提供x[i]
的水份,包含y[i]
的卡路里,只能选择一种饮料一直喝,现在需要至少m
毫升的水份,求出摄入的卡路里总和最小的饮料。并且一旦打开一瓶饮料,就要喝完。
思路分析(暴力)
- 直接对所有饮料进行遍历,求出每一种饮料满足
m
毫升水份,所摄入的卡路里cnt2
,然后求出最小值。 - 由于打开一瓶饮料,必须喝完,所以在求饮料瓶数是,要向上取整,用一个
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
题目大意
有4
门考试,每门考试满分100
,最低0
分,题目中给出了成绩与绩点的对应关系,现在给出4门考试的总分,求出绩点的和最大是多少
思路分析(参照大佬)
- 用一个
map<int,int>
来保存分数与绩点的对应关系,此处并将绩点*10
,方便计算,最后再/10.
,输出一位小数 - 用四个循环对四门课分数进行遍历,求出在给定总分下,绩点的最大值。这里用到了
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
题目大意
给定a
,b
两个正整数,每次从中选一个大于1
的数减1
,直到两个数都为1
,求出在整个过程中两个数互质的次数最多是多少。
思路分析
- 逆向思维,直接打表,定义一个二维数组
f[i][j]
,然后从1
开始,直到给定的最大范围1000
,求出i,j
两个整数在题目要求过程中最大互质次数,保存在f[i][j]
中。 - 其中判断两数互质,用到
__gcd(m,n)
函数。 - 输入
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]);
}
}