kotonoha_pcg@ぷろこんにっき

ここ(http://kotonoha-pcg.hatenablog.com/)の別館です、競プロの話が殆どです。最近mdモードに変えて一気に使い勝手が変わりました。

CF#477(Div.2) A

問題

codeforces.com

まずはソースを。

#include <bits/stdc++.h>
using namespace std;

#define sort(v) sort(v.begin(), v.end())
#define dsort(v) sort(v.begin(), v.end());
#define gsort(v) sort(v.begin(), v.end(), greater<int>())
#define pb push_back
#define wh while
#define rep(i,n) for(int i=0;i<n;i++)
#define INF 1000000007
#define PI 3.14159265

typedef long long ll;
typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<ll> vll;

int main(){
    int n,s;
    int a,b;
    int ti[1000]={};
    cin>>n>>s;
    for(int i=0;i<n;i++){
        cin>>a>>b;
        ti[i]=a*60+b;
    }
    if(ti[0]>=s+1) {cout<<"0"<<" "<<"0"<<endl; return 0;}
    
    rep(i,n-1){
        if(ti[i+1]-ti[i]>=s*2+2){
            cout<<(ti[i]+s+1)/60<<" "<<(ti[i]+s+1)%60<<endl;
            return 0;
        }
    }
    cout<<(ti[n-1]+s+1)/60<<" "<<(ti[n-1]+s+1)%60<<endl;
    
    return 0;
}

概要

 飛行機の離着陸リスト(形式::h m)がn件あるんだけど、最も早い前後s時間空いてるとこに1件割り込ませたいんでそいつを求めてくれや、という話。

入力

n s
h(n) m(n)

出力

最も早く割り込める時間

h m

解法

 まずn回分の入力を分単位に変換して、配列に入れる。問題文から離着陸に1分掛かるとあるので、条件に合うのはs*2+2分空いてる要素数。これをn件分forループさせる。もしも0 0と次tの入力値(または最初の入力値)の間にs+1分間が空けば、強制的に出力は

0 0

になる。そうでなければ、条件に合う要素から

(ti[n-1]+s+1)/60(時) ti[n-1]+s+1)%60(分)

になる。

提出

 1つ目提出後にガリガリと書いたメモ。2つ目出すまでに別の要件が出来てやってたのだが、戻ってみるとあまりに字が汚すぎて読めず、時分まとめて分単位に変換するとか含めてだいぶコードを書き換えた。現状ローラーボール(Tombow ZOOM505)に筆記体走り書きと三項演算子殴り書きが安定してると思ってたけど、これは見直さないとやばそう。

 結局提出数は4。間の別件除くと40分くらい解いてたので掛かりすぎか。後随所にある誤字(sort()とdsort()とか)も直しておく。

追記

 7/May/2018 早速入力形式に脱字を発見したので修正。概要に入力h mの形式を追記。

CF375(Div2)(後日)

 まだ解いてる最中だが上げるだけ上げる。

A. The New Year: Meeting Friends

問題(要約)

3人は新年に向けて会うことにした。彼ら3人の3つの整数座標が与えられる。これを基に、3人が集まれば良い最短の距離を求めよ。

解法

 3人はどういう集まりか知りませんが(多分知人)、3つの整数をソートし、中間値とその両側の値との差分を求め、合計して出力。

#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
int main(){
	int n[3]={0};
	int a=0;
	rep(i,3) cin>>n[i];
	sort(n,n+3);
		a=(n[0]>n[1])?n[0]-n[1]:n[1]-n[0];
		a+=(n[2]>n[1])?n[2]-n[1]:n[1]-n[2];
	cout<<a<<endl;
	return 0;
}

 インデントが変ですが気にしない。ここで、そのインデントが一段階くぼんでいるところが差分を求めるところで、bよりaが大きければa-b、aよりbが大きければb-aとする。これをcに対しても同じように求め、合計値を出力、というようになる。

B以降はそのうち書けると思います。もう少し待って。

ABC#44

21:30から出たのが間違っていたと思う

A

 適当

#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    int n,k,q,w,ans=0;
    cin>>n>>k>>q>>w;
    for(int i=0;i<n;i++)
    {
        if(i>k-1) ans+=w;
        else ans+=q;
    }
    cout<<ans<<endl;
}

B

 アルファベットテーブル作って投げようとしたけどできてない.22:00頃完成したが勿論テストケースが合わない.放棄してCへ.

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    //int x=1;
    //no doing
    int cnt=0;
    cin>>s;
    //文字テーブル
    char al[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    //文字数カウント
    int v[26]={0};
    //flag
    bool bl[26];
    //どの文字があるか調べる
    for(int i=0;i<s.size();i++){
        for(int j=0;j<26;j++){
            if(s[i]==al[i]){
                v[i]+=1;
            }
        }
    }
    //v[i]%2==0ならfl+1
    for(int i=0;i<26;i++) bl[i]=(v[i]%2==0)?1:0;
    for(int i=0;i<26;i++){
        if(bl[i]!=0) cnt=1;
    }
    if(cnt==1) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0;
}

 一応書くと,全てYesになる.クソったれ.あと冗長.

C

 理屈解るけどコード起こせないマン完成.これ理屈解ってない気がする.1<=N<=16で部分点.やめた.

#include <bits/stdc++.h>
using namespace std;
int main()

{
    //入力
    
    //summer
    //x=0
    for(int i=0;i<x.size();i++){
        if(x[i]==A) cnt++;
    }
    //x=1
    for(int i=1;i<x.size();i++){
        ans=x[0];
        if((ans+x[i])%2==A) cnt++;
    }
    //x=2
    for(int i=2;i<x.size();i++){
        ans=x[0]+x[1];
        if((ans+x[i])%2==A) cnt++;
    }
    //このままx=16までやる気力は無い
}

紙で書いてたけどこちらも駄目.理屈はこれで合ってる気がする


f:id:kotonoha_pcg:20160828224819j:plain


D

 計算書けてない.最初逆算に気が付かず,適当に書いてたけどよく読んだら逆算なのに気付く.

全体

最近全然やってないな

ばぶるそーと

 少し整列やり始めようと思ったので,書いた.
tukdua.hatenadiary.jp
ここのバブルソートをそのまま実装.

#include <bits/stdc++.h>
using namespace std;
#define MAX 100

int main(){
	int n;
	int a[MAX]={0};
	
	cin>>n;
	for(int i=0;i<n;i++)cin>>a[i];

	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			if(a[i]<a[j]) swap(a[i], a[j]);
	
	for(int i=0;i<n;i++) printf("%d ",a[i]);
	
	cout<<'\n';
	
	return 0;
}

SRM687D2_Easy

出ました.クッソ眠かったです.言い訳にするつもりはありませんが,眠すぎて寝てました.Easyを20分くらいかかってやっと遠し,190点くらい貰った.この時点で瞼が眠い.Mediumは少し考えて"quack"の文字列が連続しない場合かつ混合している(例1)場合にそれぞれの配列出して,とか考えながら書いていたけど寝てた.そしてもう終わってChallengeも終わりそうだったので,諦めて寝床につきましたとさ(他人事ではないが).

  1. 例1

ququaqcuackakck

クソース

MAXは見逃してください(というかテンプレ).

#include <bits/stdc++.h>
using namespace std;

#define rep(i,n) for(int i=0;i<n;i++)
#define pb push_back
//#define MAX 100

int ans=0;

class Quorum{}
{
  public:
  int count(vector<int> arr, int k)
  {
    sort(arr.begin(), arr.end());
    for(int i=0;i<k;i++){
      ans+=arr[i];
    }
  }
  return ans;
};

解法

 sort(arr)して要素kまでの総和を返す.題意を理解するのに懲りずに時間をかけてしまった.反省.

乾燥(した感想)

すごく・・・眠かったです.あと喉乾いたのでポカリ飲みながらEasy書いてました.因みに全体では350台後半くらいだった気がします.

今年の目標

 あけましておめでとうございます.今年もどうしようもない記事で埋めていきたいと思います.
元旦が終わりそうなので急ぎながら書いています.今年の目標は大きく分けて3つです.

  1. 競技プログラミング
  2. 勉強
  3. 生活

1. 競技プログラミング

 昨年はあまり良い成績を残せていないので,全完まではいかなくても,コドフォでA完人生からは抜け出したいな,と思ってます.実行しよう.
ABCやARCに開催されている分は,時間の都合つけて参加したい.コドフォやSRMは,たまに時間忘れながらも,出たらじっくり思考することは出来ているので,適当にやりたいです.
 新しくやりたいことは,C++以外でのプロコン参加です.今までかなりC++STLの恩恵を受けてきたので,たまに頼らないときもあっていいかと考え始めました.VBは難しそうなので,たぶんD言語になると思います.

2. 勉強

 進学するんだしそろそろ良い点取ろうな.ネットワークも忘れずに.あと,D言語を本格的に始めたいです.昨年末から手を付け始めてはいますが,このままのペースだと今年中は無理そうなので.

3. 生活

よく眠り,よく育ちたい(手遅れ)

以上の3つです(3つしか考えつかなかった).今年も1年間よろしくお願いします.