题目大意是有6个城市,每个城市间有不同的交通工具每分钟运送对应的人数,问把这些人从第一个城市送到第六个城市需要多久?
解题思路:在官方题解中给出一个例子,一个水泵以15L/s的速度运输水连接上一个水泵以12L/s的速度运输水,那么水的速度会变慢,也就是这条路线运输水的速度就被限制为12L/s了。所以可以以此推出公式n/(min(a,b,c,d,e))+4。加4的原因其他城市运输水的速度与最低的相比可看做是一次性运输过来的,也就是运输时间为1分钟,在加上最慢速度两个城市的速度(得向上取整),就是答案了。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<vector>
#define inf 2147483647
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rr read()
#define ll long long
#define repb(i,a,b) for(int i=a;i<=b;i++)
#define CloseIo ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
int read()
{
char ch = getchar();
int x = 0, f = 1;
while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
while('0' <= ch && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
return x * f;
}
int main()
{
ll a,b,n,c,d,e;
cin>>n>>a>>b>>c>>d>>e;
printf("%lld\n",(n-1)/min({a,b,c,d,e})+5);
}
D - Cake 123
题意是分别有X、Y、Z个1 2 3 形状的蛋糕,问前k个1 2 3 形状的蛋糕的美味值。
第一种方法,由于数据比较水,可以先对1 2 形状的蛋糕进行相加排降序后取k个再对3形状的蛋糕相加排降序后,输出前k个值。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<vector>
#define inf 2147483647
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rr read()
#define ll long long
#define repb(i,a,b) for(int i=a;i<=b;i++)
#define CloseIo ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
int read()
{
char ch = getchar();
int x = 0, f = 1;
while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
while('0' <= ch && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
return x * f;
}
vector<ll>v[10],v1,v2;
int main()
{
CloseIo;
ll a[10],k;
rep(i,0,3)
scanf("%lld",&a[i]);
scanf("%lld",&k);
rep(i,0,3)
{
rep(j,0,a[i])
{
ll t;
scanf("%lld",&t);
v[i].push_back(t);
}
// sort(v[i].begin(),v[i].end(),cmp);
}
//printf("\n\n\n");
rep(i,0,v[0].size())
rep(j,0,v[1].size())
{
v1.push_back(v[0][i]+v[1][j]);
}
sort(v1.begin(),v1.end(),greater<ll>());
v1.resize(k);
rep(i,0,v1.size())
rep(j,0,v[2].size())
{
v2.push_back(v1[i]+v[2][j]);
}
sort(v2.begin(),v2.end(),greater<ll>());
rep(i,0,k)
printf("%lld\n",v2[i]);
}
第二种方法是:先对每个类型的蛋糕进行从大到小排序,在三重循环枚举时若满足(i+1)*(j+1)*(k+1)<=K则说明一定满足最大的前k个值,(i+1)(j+1)(k+1)所在的循环中可以看做已经枚举到了(i+1)*(k+1)*(j+1)个了,而且蛋糕已经从大到小排序了,一定是前k个内的,然后再对结果进行排序,输出前k个即可。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<vector>
#define inf 2147483647
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rr read()
#define ll long long
#define repb(i,a,b) for(int i=a;i<=b;i++)
#define CloseIo ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
int read()
{
char ch = getchar();
int x = 0, f = 1;
while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
while('0' <= ch && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
return x * f;
}
vector<ll>v[10],v1,v2;
int main()
{
CloseIo;
ll a[10],K;
rep(i,0,3)
scanf("%lld",&a[i]);
scanf("%lld",&K);
rep(i,0,3)
{
rep(j,0,a[i])
{
ll t;
scanf("%lld",&t);
v[i].push_back(t);
}
sort(v[i].begin(),v[i].end(),greater<ll>());
}
rep(i,0,v[0].size())
rep(j,0,v[1].size())
rep(k,0,v[2].size())
if((i+1)*(j+1)*(k+1)<=K)v1.push_back(v[0][i]+v[1][j]+v[2][k]);
else
break;
sort(v1.begin(),v1.end(),greater<ll>());
rep(i,0,K)
printf("%lld\n",v1[i]);
}