結果

問題 No.76 回数の期待値で練習
ユーザー myantamyanta
提出日時 2017-05-30 01:14:50
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 44 ms / 5,000 ms
コード長 1,206 bytes
コンパイル時間 491 ms
コンパイル使用メモリ 41,856 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-09-21 18:17:26
合計ジャッジ時間 980 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 44 ms
5,248 KB
testcase_01 AC 44 ms
5,376 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:24:30: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   24 |                         scanf("%d", &n[i]);
      |                         ~~~~~^~~~~~~~~~~~~

ソースコード

diff #

#include<cstdio>
#include<vector>


using namespace std;

using vd=vector<long double>;
using vi=vector<int>;


int main(void)
{
	vi n;
	vd c, p, table;
	int t, table_max=1000;
	long double r[6+1]={0.0, 0.5/6, 1.0/6, 1.5/6, 0.5/6, 1.5/6};
	r[6]=1.0-r[1]-r[2]-r[3]-r[4]-r[5];

	while(scanf("%d", &t)==1)
	{
		n.resize(t);
		for(int i=0;i<t;i++)
		{
			scanf("%d", &n[i]);
		}

		table.assign(table_max+2, 0.0);
		c.assign(table_max+2, 0.0);
		c[0]=1.0;
		for(int i=1;i<=table_max;i++)
		{
			c.swap(p);
			c.assign(table_max+2, 0.0);
			for(int j=i-1;j<table_max && j<=(i-1)*6;j++)
			{
				for(int k=1;k<=6;k++)
				{
					int idx=j+k;
					if(idx>table_max+1) idx=table_max+1;
					c[idx]+=p[j]*r[k];
					for(int l=j+1;l<=idx;l++)
					{
						table[l]+=p[j]*r[k]*i;
					}
				}
			}
		}
//		for(auto&te:table) printf("%.8f\n", (double)te);
//		for(int i=0;i<t;i++) printf("%4d %.8f\n", n[i], (double)ans[i]);
//		for(auto anse:ans) printf("%.8f\n", (double)anse);
		for(int i=0;i<t;i++)
		{
			long double ans;
			if(n[i]<=table_max)
			{
				ans=table[n[i]];
			}
			else
			{
				int d=(n[i]-table_max)/90+1;
				ans=table[n[i]-d*90]+24*d;
			}
			printf("%.8f\n", (double)ans);
		}
	}

	return 0;
}
0