2011/08/21

Codeforces Beta Round #82(Div.2) 参戦記

成績は少々悪かったですが、楽しめました。

友人とお茶を飲んだりしていたので、15分ほど遅れた開始しました。
Aのプログラムを組み、2回目の提出で通りました。時間は0:27。

Bはそれほど難しくないと感じましたが、つまらないミスをしていて難度も提出をし直すハメになりました。4回目の提出でようやく通って、0:48です。

Cを読みましたが、DPの練習不足を痛感しているので避けました。D,Eも読み、Eを解くことにします。

最初、Eは最小二乗法などの考えに似ているのかと思いましたが、全くそんなことはないということ気づきました。それが1:30頃のことです。別の方法を考えましたが、時既に遅しでした。

今考えると、Eは滑降シンプレックス法で解けたのではないかと思います。

問題はこちら.
1104点、順位は541/1340で、レートは1504から1451になりました。
もっと練習しなければなりません。
[A]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct card{
  char suit;
  char rank;
};

int win(struct card c1,struct card c2,char trump);
int num(char c);

int main(void){
  struct card c[2];
  char trump;
  scanf("%c%*c",&trump);
  scanf("%c%c %c%c%*c",&c[0].rank,&c[0].suit,&c[1].rank,&c[1].suit);
  if(win(c[0],c[1],trump)) puts("YES");
  else puts("NO");
  return 0;
}

int win(struct card c1,struct card c2,char trump){
  if(c1.suit==trump && c2.suit!=trump) return 1;
  if(c2.suit==trump && c1.suit!=trump) return 0;
  if(c1.suit!=c2.suit) return 0;
  if(num(c1.rank)<num(c2.rank)) return 0;
  else return 1;
}

int num(char c){
  switch(c){
  case 'T':
    return 10;
    break;
  case 'J':
    return 11;
    break;
  case 'Q':
    return 12;
    break;
  case 'K':
    return 13;
    break;
  case 'A':
    return 14;
    break;
  default:
    return c-'0';
  }
}

[B]
#include<stdio.h>
#include<string.h>

typedef unsigned int u_int;

typedef struct{
  u_int speed;
  u_int ram;
  u_int hdd;
  u_int cost;
} laptop;

int main(void){
  laptop coms[100],input;
  u_int i,j,k,now=0,n,flg;
  u_int min_num;

  scanf("%u",&n);
  while(n--){
    scanf("%u %u %u %u",&input.speed,&input.ram,&input.hdd,&input.cost);
    flg=1;
    coms[now++]=input;
  }

  for(i=0;i<now;i++){
    for(j=i+1;j<now;j++){
      if(coms[i].speed<coms[j].speed && coms[i].ram<coms[j].ram && coms[i].hdd<coms[j].hdd) coms[i].cost=100000;
      else if(coms[i].speed>coms[j].speed && coms[i].ram>coms[j].ram && coms[i].hdd>coms[j].hdd) coms[j].cost=100000;
    }
  }
  min_num=0;
  for(i=1;i<now;i++) if(coms[min_num].cost>coms[i].cost) min_num=i;
  printf("%u\n",min_num+1);
  return 0;
}

0 件のコメント:

コメントを投稿