codeforces #334A,B

第一题需要注意不要直接用浮点数进行计算,比如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;
 }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值