結果

問題 No.2852 Yakitori Optimization Problem
ユーザー nekotinekoti
提出日時 2024-08-25 14:23:19
言語 C
(gcc 12.3.0)
結果
AC  
実行時間 136 ms / 2,000 ms
コード長 2,850 bytes
コンパイル時間 226 ms
コンパイル使用メモリ 30,592 KB
実行使用メモリ 12,668 KB
最終ジャッジ日時 2024-08-25 14:23:22
合計ジャッジ時間 3,464 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 32 ms
6,812 KB
testcase_01 AC 94 ms
9,864 KB
testcase_02 AC 77 ms
8,840 KB
testcase_03 AC 132 ms
12,360 KB
testcase_04 AC 101 ms
10,808 KB
testcase_05 AC 37 ms
6,944 KB
testcase_06 AC 12 ms
6,944 KB
testcase_07 AC 101 ms
10,340 KB
testcase_08 AC 9 ms
6,940 KB
testcase_09 AC 130 ms
12,356 KB
testcase_10 AC 135 ms
12,600 KB
testcase_11 AC 133 ms
12,612 KB
testcase_12 AC 136 ms
12,660 KB
testcase_13 AC 133 ms
12,668 KB
testcase_14 AC 132 ms
12,660 KB
testcase_15 AC 135 ms
12,660 KB
testcase_16 AC 134 ms
12,532 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#define _DEBUG 0

#include<stdio.h>
#include<stdbool.h>
#include<string.h>
#include<stdlib.h>
//■構造体qsort(複数文字列も可)
typedef struct st
{
  int idx;
  long long a;
  long long b;
  long long c;
  long long diff;
} st;
#define _SORT_TYPE st
#define _LIST_NUM (200010)
_SORT_TYPE stList[_LIST_NUM];
// 昇順:上から1,-1,0
int cmpnum_idx_asc(const void * n1, const void * n2){
  if(((_SORT_TYPE *)n1)->idx > ((_SORT_TYPE *)n2)->idx)return 1;
  else if(((_SORT_TYPE *)n1)->idx < ((_SORT_TYPE *)n2)->idx)return -1;
  else return 0;
}
int cmpnum_a_asc(const void * n1, const void * n2){
  if(((_SORT_TYPE *)n1)->a > ((_SORT_TYPE *)n2)->a)return 1;
  else if(((_SORT_TYPE *)n1)->a < ((_SORT_TYPE *)n2)->a)return -1;
  else return 0;
}
int cmpnum_b_asc(const void * n1, const void * n2){
  if(((_SORT_TYPE *)n1)->b > ((_SORT_TYPE *)n2)->b)return 1;
  else if(((_SORT_TYPE *)n1)->b < ((_SORT_TYPE *)n2)->b)return -1;
  else return 0;
}
int cmpnum_c_asc(const void * n1, const void * n2){
  if(((_SORT_TYPE *)n1)->c > ((_SORT_TYPE *)n2)->c)return 1;
  else if(((_SORT_TYPE *)n1)->c < ((_SORT_TYPE *)n2)->c)return -1;
  else return 0;
}
int cmpnum_diff_dsc(const void * n1, const void * n2){
  if(((_SORT_TYPE *)n1)->diff > ((_SORT_TYPE *)n2)->diff)return -1;
  else if(((_SORT_TYPE *)n1)->diff < ((_SORT_TYPE *)n2)->diff)return 1;
  else return 0;
}
int main(void)
{
  int scan;//scanf警告用
  int i, j;
  
  int n,k;scan=scanf("%d%d",&n,&k);
  long long val;
  //【A】
  for(i=0; i<n; i++)
  {
    scan=scanf("%lld",&val);
    stList[i].idx=i;
    stList[i].a=val;
  }
  //【B】
  for(i=0; i<n; i++)
  {
    scan=scanf("%lld",&val);
    stList[i].idx=i;
    stList[i].b=val;
  }
  //【C】
  for(i=0; i<n; i++)
  {
    scan=scanf("%lld",&val);
    stList[i].idx=i;
    stList[i].c=val;
    stList[i].diff=stList[i].b-stList[i].c;
    if(stList[i].diff<0)stList[i].diff*=-1;
  }
  qsort(stList, n, sizeof(_SORT_TYPE), cmpnum_diff_dsc);
  
#if _DEBUG
  for(i=0; i<n; i++)
  {
    printf("diff=%lld : b=%lld c=%lld\n",stList[i].diff,stList[i].b,stList[i].a);
  }
#endif

  int bcount=0,ccount=0;
  long long sum=0;
  //イコールのやつのこと考えてみる
  for(i=0; i<n; i++)
  {
    if(stList[i].b>stList[i].c)
    {
      //塩?
      if(bcount<k)
      {
        //塩
        sum+=stList[i].b;
        bcount++;
      }
      else
      {
        //タレ
        sum+=stList[i].c;
        ccount++;
      }
    }
    else if(stList[i].c>stList[i].b)
    {
      //タレ?
      if(ccount<n-k)
      {
        //タレ
        sum+=stList[i].c;
        ccount++;
      }
      else
      {
        //塩
        sum+=stList[i].b;
        bcount++;
      }
    }
    else
    {
      //どっちも一緒
      sum+=stList[i].b;
    }
    //共通
    sum+=stList[i].a;
  }
  printf("%lld\n",sum);
  return 0;
}
0