又来贴水题了,哭唧唧
A |
gpa |
是一道01分数规划题
可以参考一下这篇博客https://blog.csdn.net/mosquito_zm/article/details/78585094
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
const double INF = 1<<20;
int n,k;
int s[maxn],c[maxn];
double res[maxn];
void init()
{
memset(s,0,sizeof(s));
memset(c,0,sizeof(c));
memset(res,0,sizeof(res));
}
bool isok(double x)
{
for(int i=1;i<=n;i++)
{
res[i] = s[i]*c[i]-x*s[i];
}
sort(res+1,res+1+n);
double ans = 0;
for(int i=n;i>=k+1;i--)
{
ans += res[i];
}
double tmp = ans;
for(int i=k;i>=1;i--)
{
ans = max(ans,tmp);
tmp += res[i];
}
return ans>=0;
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
init();
for(int i=1;i<=n;i++)
{
scanf("%d",s+i);
}
for(int i=1;i<=n;i++)
{
scanf("%d",c+i);
}
double l=0,r=1e3+7;
while(r-l>=1e-6)
{
double mid = (l+r)/2;
if(isok(mid))
{
l = mid;
}
else
{
r = mid;
}
}
printf("%.5lf\n",l);
}
return 0;
}
G |
max |
根据a,b最大公约数是c去找a,b; 当同时乘以两个互质的数时得到的a,b最大公约数是c,而且两个连续的数肯定是互质的,考虑清3种情况就行了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e9+7;
int main()
{
ll c,n;
while(~scanf("%lld%lld",&c,&n))
{
ll k = n/c;
if(k>=2)
{
printf("%lld\n",k*c*(k-1)*c);
}
if(k==1){
printf("%lld\n",c*c);
}
if(k<1)
{
printf("-1\n");
}
}
return 0;
}
J |
plan |
比赛时真的写的又臭又长,现在精简了,简而言之,就是根据2人间和3人间的性价比优先考虑哪个。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF=INT_MAX;
LL n,p2,p3;
int main() {
scanf("%lld%lld%lld",&n,&p2,&p3);
LL sum=0;
if(3*p2<=2*p3){//二人间性价比高
sum=n/2*p2;//先尽可能的全是二人间
if(n%2==1 && n/2) sum+=min(p2,p3-p2);//如果多了一个,且二人间多于1间,那就可以考虑
//是加一个二人间还是减掉一个二人换一个三人
else if (n%2)sum +=min(p2,p3);//考虑只有一个人的情况
}
else{
sum=n/3*p3;
if(n%3==2) sum+=min(p2,p3);
if(n%3==1&&n/3) sum+=min(2*p2-p3,p2);//多了一个,可以少一个3人加两个2人,也可以直接加一个二人
if(n%3==1&&n/3==0) sum+=p2;//只有一个人
}
printf("%lld\n",sum);
}