kmjp's blog

競技プログラミング参加記です

Codeforces Global Round 25 : D. Buying Jewels

いまいちだった回。
https://codeforces.com/contest/1951/problem/D

問題

整数N,Kが与えられる。
AliceはN円を持っている。
Bobは、最大60種類のコイン販売所を設け、それぞれ1コインあたりの金額を定めることができる。各販売所では無限の枚数のコインを売っている。
Aliceは先頭から順に販売所を訪れ、手持ちの金額で買えるだけコインを買う。

Bobは、AliceにちょうどK枚買わせる値付けが可能か判定せよ。

解法

K=1やN=Kの時は、K円や1円の販売所を設ければよいので自明。
それ以外の場合、初手で1コインで残金を(K-1)円にさせられれば、残りを1円のコイン(K-1)枚買わせることができる。

int T;
ll N,K;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>T;
	while(T--) {
		cin>>N>>K;
		
		if(K==1) {
			cout<<"YES"<<endl;
			cout<<1<<endl;
			cout<<N<<endl;
			continue;
		}
		if(N==K) {
			cout<<"YES"<<endl;
			cout<<1<<endl;
			cout<<1<<endl;
			continue;
		}
		if((N-(K-1))*2>N) {
			cout<<"YES"<<endl;
			cout<<2<<endl;
			cout<<(N-(K-1))<<" "<<1<<endl;
		}
		else {
			cout<<"NO"<<endl;
		}
		
		
	}
}

まとめ

こういう問題で躓くのもったいないな…。