Official

B - Alcoholic Editorial by kyopro_friends


\(i\) 番目のお酒に含まれているアルコールの量は \(V_i*P_i/100\) です。前から順にこれらの和を計算していき、初めて \(X\) を超えるところを出力すれば良いです。

しかし、浮動小数点数の演算は一般に誤差を含みます。例えば、以下の入力の正しい答えは -1 ですが、実装と環境によっては 3 を出力する場合があります。

3 13
30 13
35 13
35 13

このような問題を避ける最も簡単な方法は、整数のみで計算できるように適切な式変形を行うことです。

今回の場合、\(V_1*P_1/100+\ldots >X\) かどうかを判定したいので、両辺に \(100\) を掛け \(V_1*P_1+\ldots > X*100\) とすることで、整数のみで計算できます。

実装例(C)

#include<stdio.h>

int main(){
	int n,x;
	scanf("%d%d",&n,&x);
	int sum=0;
	for(int i=0;i<n;i++){
		int v,p;
		scanf("%d%d",&v,&p);
		sum+=v*p;
		if(sum>x*100){
			printf("%d\n",i+1);
			return 0;
		}
	}
	puts("-1");
}

実装例(Python)

N,X = map(int,input().split())
s = 0

for i in range(N):
  v,p = map(int,input().split())
  s += v*p
  if s > X*100:
    print(i+1)
    exit()

print(-1)

posted:
last update: