第一题需要注意不要直接用浮点数进行计算,比如0.3*n可用3*n/10
#include <stdio.h>
#include <string.h>
int max(double a,double b)
{
return a>b?a:b;
}
int main()
{
int m[6];//在什么时候做出
int w[6];//提交错误几次
int v[6]={0,500,1000,1500,2000,2500};
int h1,h2,i,j;
double sum;
memset(m,0,sizeof(m));
memset(w,0,sizeof(w));
for (i=1;i<=5;i++)
scanf("%d",&m[i]);
for (i=1;i<=5;i++)
scanf("%d",&w[i]);
scanf("%d%d",&h1,&h2);
sum=0;
for (i=1;i<=5;i++)
{
sum=sum+max(3*v[i]/10,v[i]-v[i]/250*m[i]-50*w[i]);
}
sum=sum+h1*100-h2*50;
printf("%.0f\n",sum);
return 0;
}
一开始想错了,思路很简单,每一次取出最小的两堆合并,重复n-m次,可以使用优先权队列
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstdio>
using namespace std;
struct night
{
int value;
bool operator<(const night &k)const
{
return value>k.value;
}
}k;
priority_queue<night>q;
int main()
{
int n,m,k,i,j,c;
night temp,temp2;
while(!q.empty())
q.pop();
scanf("%d%d",&n,&k);
for (i=1;i<=n;i++)
{
scanf("%d",&c);
temp.value=c;
q.push(temp);
}
for (i=1;i<=n-k;i++)
{
temp=q.top();
q.pop();
temp2=q.top();
q.pop();
temp.value=temp.value+temp2.value;
q.push(temp);
}
while(!q.empty())
{
temp=q.top();
q.pop();
}
printf("%d\n",temp);
return 0;
}
被hack了~~
4
1 2 8 9
所以每一次应该选取当前最小和当前最大进行合并,当然因为只需要合并n-k次,所以只需选取1~2*(n-k)的下标的数,每一次取出当中i和2*(n-k)-i+1进行合并,同时与之前没有放入考虑的最大值进行比较。
#include <stdio.h>
#include <string.h>
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,m,i,j,ans;
int a[100005];
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
ans=a[n];
for (i=1;i<=n-m;i++)
ans=max(ans,a[2*(n-m)-i+1]+a[i]);//每一次把当前最小的与当前最大的合并
printf("%d\n",ans);
return 0;
}