[2020.2 2.5日Jizhong]問題のシミュレーションゲームの解

ディレクトリ

T1:最大值
T2:火柴
T3:游戏
T4:hack的比赛

異常な、次のゲームである......幸せ%

トピックに戻る... T1:最大

タイトル説明

所定数nは、{X1、X2、...、XN}要件の選択少なくとも数、最大数のN製品、例えば、最大の和。

エントリー

最初の行の整数nは、数は数を表し
、次のn行、各行整数XIを、-10≤xi≤10

輸出

出力ライン、最大の製品を表し、

サンプル入力

サンプル入力1

3
-1
2
-4

サンプル入力2:

3
3
2
-4

分析:列挙

記録最大の負の数(を除く)、番号0(決意結果)。
いくつかに注意して詳細
の波行う裁判官をうまく。
------------------------------

コード:

#include<cmath>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
int x,w,k,n,i,maxx=-0x7fffffff+1;//int最小值
int ans=1;//为1,不然怎么乘都是0
int main(){
	freopen("max.in","r",stdin);
    freopen("max.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		if(x!=0) ans*=x; //先乘起来
		else w++;  //是0就计数
		if(x<0)
		{
			if(maxx<x) maxx=x;  //找最大负数
		}
	}
	if(ans<0&&ans!=maxx) ans/=maxx;  //除
	if(w==n) cout<<0;  //全部是0
	else cout<<ans;

return 0;
}

T2:マッチ

タイトル説明

ここに画像を挿入説明
Nビットの数を考えると、マッチスティックの後に並び替え、1が持つことができるの最大数はどのくらいですか?
注には、多かれ少なかれ所のうち、それをすべて使用してマッチ棒ないこと。

エントリー

データの数を表す整数最初のラインTはセット
Nの整数それぞれ、次のTラインを、Nは元の数を表すビットの数であり、プリアンブルは0であってもよいし、スペースで区切ら。

輸出

各試験、出力ラインのために、最大数は、数を得ることができます。

サンプル入力

3
1 3
3 512
3 079

サンプル出力

5
977
997

分析:貪欲

記録するのに必要な各数値の一致数の最大から最小まで、ハイからローに、(あなたに絵を)列挙置けば、続いこの図、全体の2〜8フルリリースをやつけた:大丈夫(ノートへちょうど)を実行します。入力した文字に、注意を払う変換、それを。
------------------------------

コード:

#include <cstdio>
#include <cstring>
using namespace std;
const int cnt[10] = {6,2,5,5,4,5,6,3,7,6};  //火柴棒数
int t,n,sum,cur;
char ch;
inline bool judge(int i,int j)
{return i * 2 <= j && j <= i * 7;}  //判断函数
int main()
{
	freopen("match.in","r",stdin);
	freopen("match.out","w",stdout);
	scanf("%d",&t);
	while(t--)
	{
		sum = 0;
		scanf("%d",&n);
		for(register int i = 1;i <= n;++i)
		{
			scanf(" %c",&ch);
			sum += cnt[ch - '0'];  //先全部加起来
		}
		for(register int i = n;i >= 1;--i)
		{
			cur = 9;
			if(i == 1)  //特判
			{
				while(sum != cnt[cur])
					--cur;
				putchar(cur + '0');
				break;
			}
			while(!judge(i - 1,sum - cnt[cur]))
				--cur;
			sum -= cnt[cur];  //排除不能的
			putchar(cur + '0');
		}
		puts("");
	}
	return 0;
}

T3:ゲーム

タイトル説明

1及びnは、その後、郭は数を推測しようとする間呂瞑想のx番号:Guyu郭とチューブ呂は、ゲームをプレイしています。
「未知数YI割り切れることはありますか?」:郭mが前方に質問を置くことができ
郭は最初すべての与えられた彼の質問をするM、及びLuがありません「「はい」かですべての質問に続く次の手順に従ってゲームを「答え。回答メートルの質問を取得した後、郭は彼の推測を与えます。
郭は、この質問mを上げるための最良の方法に彼を助けるためにプログラムを書いた、そして今、彼は保証の下で決定的な答え、最小Mの尋ねられることが可能な質問の最小数を知りたいと思いました。しかし、郭は、お菓子やコードを変更するには時間がないを送信するために彼の美しい姉妹校を食べて忙しかった、彼はあなたを見つけたので、私はあなたが彼がこの問題を解決するのに役立つことを願って、(そのお菓子をたくさんの有効期限が近づいているがあり、非常に多くのキャンディーの姉妹を送信します)。

エントリー

列、整数n

輸出

列、整数m

サンプル入力

サンプル入力[1]

4

サンプル入力[2]

8

サンプル出力

出力例[1]

3

出力例[2]

6

分析:列挙と数学

一回レイズとしてメートルの質問、そして答え、唯一の問題により決定することができるすべてのケースで終わることができました。
全て以内N 素数を探し出し、使用ブールタイプが格納されている
答えが全てであり、プッシュプッシュ、実際に発生する可能性が素数の数は、すべての素数のための答えので、パワー<= n個の
------- -----------------------

コード:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
bool f[100010];
long long w;
int n,ans;
int main()
{
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	cin>>n;
	memset(f,false,sizeof f);
	f[1] = true;
	ans = 0;
	for(int i = 2;i <= n;i++)  //找质数
		if(f[i] == false)
			for(int j = 2;j <= n / i;j++)
				f[i * j] = true;  //布尔存放
	for(int i = 2;i <= n;i++)
		if(f[i] == false)
		{
			w = i;
			while(w <= n)
			{
				ans++;  //出现次数
				w *= i;  //幂次
			}
		}
	cout<<ans;
}

T4:ハックゲーム

タイトル説明

終わりに近づいラウンドCodefires!ZCCは、ポイントCのタイトルを介して行われました。しかし、彼は他の選手にも問題を解決するのが最も困難な部屋を見つけるために驚きました。ZCCは、ほとんどのプレイヤーは、FST経験に基づくうと結論づけました!もちろん、最高のプレーヤーMemset137を評価の除去。これに先立ち、ZCCは彼より高いスコアにするためにそれらをハックしたいです。ZCC、Nの選手の部屋に加えて、彼らは小さなから大規模まで(Memset137は、N番目のプレイヤーにランクされるように)格付けに応じてソートされています。ZCCが正常にi番目のプレーヤーをハックすると、彼はポイントに私の収入を得るでしょう。あなたはさらにMemset137と、自分以外のすべてのプレーヤーをハックすることができますが、その間に他のプレイヤーと干渉しない、クラックショット、その高度な技術をZCCハックをとることができます。
謙虚でZCC以来、彼はハイスコアをしたくありませんでした。ZCCは、知りたいので、彼のスコアのLとR(C≤L≤R<C + N)の間、多くのさまざまな選択肢にいくつかのハッキングプログラムがあります。
もちろん答えはモジュロ998 244 353に対する答え素晴らしい、してください出力されます。

エントリー

ライン、4つの整数N、C、L、R Nプレーヤーを表し、現在のスコアは、R Lを獲得することが望ましいとの間に、Cであります

輸出

出力ライン、プログラムの数

サンプル入力

サンプル入力1:

3 0 1 2

サンプル入力2:

5 13 14 17

サンプル入力3:

100 0 23 59

サンプル出力

サンプル出力1:

2

サンプル出力2:

6

サンプル出力3:

90567

分析:DP

まず、F [i]は[J]は私いくつかの前部とjの数から選択されたセットは、プログラムの数であり
それは簡単に起動することであるF [I] [J] = F [I-1]〜[J] + F [ I-1] [JI】
しかしながら、この空間の複雑さであるO(NC) 間違い揚げます
ので、見つかったフロントの数MとにM(M-1)/ 2
注文が(M-1)mは/ 2 = N、次にのみルートレベルをm個のnは、最大から選択されたルートのn
がに変換することができる[J] = F [1-I、JI] + F [I、JI] [I] Fから選択されます(数i、jは数ある
プログラム)------------------------------

コード:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,c,l,r,dp[2][10000];
int main()
{
	freopen("hack.in","r",stdin);
    freopen("hack.out","w",stdout);
        scanf("%d%d%d%d",&n,&c,&l,&r);
        l -= c,r = min(r - c,n - 1);
        memset(dp,0,sizeof(dp));
        dp[0][0] = 1;
        int ans = l <= 0 ? 1 : 0;
        for(int i = 1;(i + 1) * i / 2 <= r;i++)
        {  //dp过程
            for(int j = (1 + i) * i / 2;j <= r;j++)
            {
                dp[i & 1][j] = (dp[i & 1][j - i] + dp[(i - 1) & 1][j - i]) % 998244353;
                if(l <= j && j <= r)
                    ans = (ans + dp[i & 1][j]) % 998244353; //取%
            }
            memset(dp[(i - 1) & 1],0,sizeof(dp[(i - 1) & 1]));  //重新初始化
        }
        printf("%d\n",ans);
}

いずれもありません......

公開された48元の記事 ウォン称賛34 ビュー4802

おすすめ

転載: blog.csdn.net/dgssl_xhy/article/details/104196936