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

内容:

T1:找路
T2:家庭作业
T3:算法学习
T4:友好数对

正题:

T1:方法を見つけるために

タイトル説明

彼は非常に狭い場所に好転しませんので、彼が運転することを学ぶための場所を探して回る必要はありませんので、ミルコはちょうど、ドライブに学び始めました。袋小路から抜け出すことは不可能であるため、Uターン(ミルコは逆にしないだろうと仮定して)しない限り、ミルコはすぐに、彼は何の行き止まりになることはありませ場所を探していました。さて、あなたはミルコの練習走行のためにこの場所かどうかを勉強する場所の地図を解析するプログラムを作成する必要があります。

このマップは、R * Cは細胞である、「X」のセルは、セル内に、建物を表し含まれています。「」道路を代表して。路面細胞からは、ミルコは長い場所は、道路開い過去されると、離れた次のセルに4つの方向上下こと。

最後に、我々はこのマップに来る行き止まりが含まれている、任意の方向に移動することができます任意のセルからの道は、我々が開始点に戻ることができるようになります好転させることができない場合は、このマップは死んで終わりではありません。

エントリー

最初の行は、2つの整数、RおよびC(3 <= R、C <= 10)を含む、マップのサイズことを示しています。

次のRの行は、Cの文字を有する各列は、各文字が「X」であってもよいです。「」(相互に到達可能な)道路は、少なくとも二つのセルをマッピングし、そしてすべての道路が接続されています。

輸出

出力の1行だけ、0の出力は、出力1は、このマップ行き止まりの存在を示し、マップが死んで終わりではないことを示しています。

ここに画像を挿入説明

分析:

この質問は非常に簡単です。
することであるトラバースポイントがある場合は、マップ全体を囲まれ、「」、数えます。
<2このような点がある場合は、それは示していないデッドエンドを

コード:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
char a[12][12];
int m,n;
bool f=true;
int main()
{
	freopen("okret.in","r",stdin);
	freopen("okret.out","w",stdout);
	memset(a,'X',sizeof(a));
	scanf("%d%d",&m,&n);
	for (int i=1;i<=m;i++)
	{
		for (int j=1;j<=n;j++)
		{
			scanf(" %c",&a[i][j]);  //读入
		}
	}
	for (int i=1;i<=m;i++)
	{
		for (int j=1;j<=n;j++)
		{
			int t=0;  //计数器
			if (a[i][j]=='X') continue;  //不是'.'
			if (a[i-1][j]=='.') t++;
			if (a[i][j-1]=='.') t++;
			if (a[i+1][j]=='.') t++; //判断上下左右
			if (a[i][j+1]=='.') t++;
			if (t<2)  //小于2个
			{
				f=false;
			}
		}
	}
	if (f) printf("0");  //没有死胡同
	else printf("1"); //有死胡同
}

T2:宿題

タイトル説明

Mirko最近收到了一个家庭作业,作业的任务是计算两个数A和B的最大公约数。由于这两个数太大了,我们给出了N个数,他们的乘积是A,给出M个数,他们的乘积是B。

ミルコは自分の答えをチェックしたいので、彼はあなたがこの問題を解決するためのプログラムを書きたいです。以上の9桁の最大公約数は、あなただけ出力することで、最終的な9が必要な場合。

エントリー

最初の行は、正の整数N、1-1000の範囲を含んでいます。スペースで区切られたNの正の整数(未満100億)の2行目には、彼らは、Aの生成物であります 第三行は、正の整数M、1-1000の範囲を含んでいます。4行目は、正の整数(100億未満)M、それらはBの生成物であるスペースで区切られています

輸出

出力は、唯一のラインを有している結果は、9桁、それの最後の9桁の出力を超えた場合、AとBの最大公約数を表します。
ここに画像を挿入説明

分析:

この質問は必要と最大公約数を
最大公約数場合>質問を尋ね、するラベルされた、そして最終的に決定するもの、のprintf(「%の09ld」、ANS) 出力された後、9

#include<cmath>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
int n,m;
LL k,ans=1,a[1001],x,f;
int euclid(int y,int x)
{
	if(x==0) return y;  //求最大公约数函数
	return euclid(x,y%x);
}
int main(){
	//freopen("zadaca.in","r",stdin);
	//freopen("zadaca.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++) 
	scanf("%lld",&a[i]);
	scanf("%d",&m);
	for(int i=1; i<=m; i++)
    {
        scanf("%lld",&x);
        for(int j=1; j<=n; j++)
        {
            k=euclid(a[j],x);  //找两个数列中的最大公约数
            if(ans*k>=1000000000)  
                f=1;  //标记
            ans=ans*k%1000000000;  //取后9位
            a[j]/=k;
            x/=k;
        }
    }
    if(f==1) //有标记
        printf("%09ld",ans);  //输出后9位
    else
        printf("%lld",ans);
}

T3:学習アルゴリズム

タイトル説明

動的プログラミングの学習ので、殿堂入りKXP制御のうち、プログラミングのダイナミックの愛は、問題のビットが毎日行う持っている、ある日、彼は問題を見つけましたが、そうではないだろう、彼はあなたを発見しました。タイトルは、以下:
順不同ではない繰り返しの所定のN個を、次いで、Mは、であれば数Nは、ANSは、元の列の数を2 ^ K、Kの数を増加させること数かどうかを尋ねるために、各時間が求められ場所。
あなたが唯一必要となるANSが、大きすぎるので、出力は10 ^ 9 + 7モッズANS。

エントリー

最初の行、二つの数N、M、2行目の数N、三行番号M.

輸出

出力最終的な答え。

サンプル入力

5 5
1 3 4 6 5
1 8 1 3 6

サンプル出力

24

分析:

それは次のように解釈される高速電力+バイナリ検索
二つの機能を築くために取られた後、主な機能を OKに。

コード:

#include <iostream>
#include <cstdio>
using namespace std;
long long k,n,m,ans,z,a[100001],b[100001],c[100001];
void fast(long long l,long long r)
{   //快速幂
    if (l>=r) return;
    int i=l,j=r;
    long long mid=a[(l+r)/2];
    do
    {
        while(a[i]<mid) i++;
        while(a[j]>mid) j--;
        if(i<=j)
        {
            a[0]=a[i];a[i]=a[j];a[j]=a[0];
            b[0]=b[i];b[i]=b[j];b[j]=b[0];
            i++;j--;
        }
    }
    while(i<=j);
    fast(l,j);
    fast(i,r);
}
int search_(long long x,long long y)
{  //二分查找
    int m=x+(y-x)/2;
    if(a[m]==k)
        return m;
    if(a[m]>k)
        return search_(x,m-1);
    if(a[m]<k)
        return search_(m+1,y);
}
int main()
{   
    freopen("sfxx.in","r",stdin);
    freopen("sfxx.out","w",stdout);
    cin>>n>>m;
    b[0]=1; 
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
        b[i]=(b[i-1]*2)%1000000007;
    }
    fast(1,n);
    for(int i=1; i<=m; i++)
    {
        cin>>k;
        if((k>=a[1])&&(k<=a[n]))
        {
            ans=(ans+b[search_(1,n)])%1000000007;  //带入再%
        }
    }
    cout<<ans<<endl;
}

T4:のフレンドリー数

タイトル説明

 在顺利完成家庭作业以后,Mirko感到非常的厌倦。所以,他列出了N个数,这些数中有些数对他是喜欢的,有些数对他是不喜欢的。

彼は2つの数の少なくとも一つの同じ番号が(同じ場所で必要とされていない)、これら2つの数字が友情権の数がある場合は、友情の数の数と呼ばれるのが好き。このN-フレンドリーで助けミルコはペアのどのように多くのカウント数を見つけるしてください。

エントリー

Nの整数正の最初の行(1 <= N <= 1000000)。

次のN行、各行1から1018の間の範囲の正の整数。任意の2つの数の数Nが異なっています。

輸出

唯一のラインは、整数は、友情のペアの数を表します。

ここに画像を挿入説明

分析:

ただ、この質問を見てない感じ
私たちの学校を聞いた後dalaoはあまりにも、後で説明:
最初に数値を入力し、バイナリ 2つの数の判断の下に持っていないと同じものが1である、である、持って同じ番号を、そしてマーク最後の審判の電流を法的、蓄積答え。

コード:

#include<cmath>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
LL ans,b[10001];
LL i,n,t,s,j,k,x;
int main(){
	//freopen("kompici.in","r",stdin);
	//freopen("kompici.out","w",stdout);
	scanf("%lld",&n);
	for(i=1;i<=n;i++)
	{
		t=0;s=0;
		scanf("%lld",&x);
		while(x>0)
		{
			t=x%10;
			x=x/10;
			s=s|(1<<t);  //或运算+位运算判断哪一位相同
		}
		b[s]++;  //相同的位标记
	}
	for(i=1;i<=1023;i++)
	{
		if(b[i]==0) continue;  //没有标记
		for(j=1;j<=1023;j++)
		{
			if((i&j)==0/*没有一位相同*/||b[j]==0||i==j) continue;  //都是不合法条件
			ans=ans+b[i]*b[j]; 
		}
		ans=ans+b[i]*(b[i]-1);
	}
	ans=ans/2;  //最后 div 2
	cout<<ans;
	
return 0;
}
公開された48元の記事 ウォン称賛34 ビュー4794

おすすめ

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