题解:P13168 [GCJ 2017 #1C] Ample Syrup
题意
题目要求出从下往上暴露表面积最大值,可以将其化简为最下方松饼顶面积与各层松饼侧面积之和。
实现
对于每个询问,进行侧面积降序排序,第一层循环枚举最下方的松饼,第二层循环再逐层贪心选择侧面积进行计算。
细节
对于计算,应进行特判,如:第二层循环枚举下标与第一层重复,则跳过;上方松饼比最下方半径大亦跳过。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,n,m,ans;
const long double pi=3.14159265359;
struct Node{
ll r,h;
}a[10086];
bool cmp(Node a1,Node a2){
return a1.r*a1.h>a2.r*a2.h;
}
int main(){
cin>>t;
for(ll _=1;_<=t;_++){
ans=0;
cin>>n>>m;
for(ll i=1;i<=n;i++){
cin>>a[i].r>>a[i].h;
}
sort(a+1,a+n+1,cmp);
for(ll i=1;i<=n;i++){
ll now=a[i].r*a[i].r+a[i].r*2*a[i].h,k=0;
for(ll j=1;j<=n&&k<m-1;j++){
if(j!=i&&a[j].r<=a[i].r){
now+=a[j].r*2*a[j].h;
k++;
}
}
if(k==m-1) ans=max(ans,now);
}
cout<<fixed<<setprecision(9);
cout<<"Case #"<<_<<": "<<ans*pi<<'\n';
}
return 0;
}
总结
一道水黄,但是应注意细节,才能满分。