ブルーブリッジカップ練習システムの試験問題の継続的な更新


使用IDEはDevc++5.4である.0
入門訓練
精度を設定して小数点の桁数を固定する
#include
#include 
#include
using namespace std;
int main()
{
	int radius;
	cin>>radius;
	double p=atan(1.0)*4;
	double area=p*radius*radius;
	cout<
setprecision設定精度、前にfixed制御小数点の精度を加える
フィボナッチ数列
時間制限1.0 s内メモリ制限256 MB
#include
#include
using namespace std;

int main()
{
	int n;
	cin>>n;
	int F[n];
        F[0]=0;
	F[1]=F[2]=1;
	if(n>=3)
	{
		for(int i=3;i<=n;i++)
	    {
		     F[i]=(F[i-1]+F[i-2])%10007;
	    }
	} 

	
	cout<
テクニック:
<1>配列を使用してFシーケンスを保存し、10007を除いた残りのみを保存します.
<2>F[1]=1,F[2]=1を先に命令し、F[i]=(F[i-1]+F[i-2])%10007を用いてF[i]を計算する.
基礎練習
閏年判断
説明:4で割り切れるが100または400で割り切れないデータ
#include
#include
using namespace std;

int main()
{
	int n;
	cin>>n;
	if(n<1990||n>2050)
	cout<
長さ5ビットの01列については、各ビットが0または1であり、32種類の可能性がある.最初の数は次のとおりです.
00000
00001
00010
00011
00100
この32種類の01列を小さい順に出力してください.
まず、この問題は暴力で手動で入力してもいいが、肝心なのは32回しかないということだ.7-8位ならどうすればいいのだろうか.
int main()
{
	for(int i=0;i<=31;i++)//        32  
	{
		int a[5]={0};//     5       00000 
		int num=i;//num          
		int z=0; 
		while(num!=0)
		{
			a[z]=num%2;
			z++;
			num/=2;
		}
		for(int j=4;j>=0;j--)
		cout<
基礎練習数列フィーチャー
時間制限:1.0 sメモリ制限:256.0 MB
問題の説明
n個の数を与え,このn個の数の最大値,最小値,およびを探し出す.
入力フォーマット
第1の動作整数nは、数の個数を表す.
2行目にはn個の数があり、与えられたn個の数であり、各数の絶対値は10000未満である.
出力フォーマット
3行を出力し、行ごとに整数を1つずつ出力します.1行目はこれらの数の最大値を表し、2行目はこれらの数の最小値を表し、3行目はこれらの数の和を表す.
#include
using namespace std;
int main()
{
	int num;
	cin>>num;
	int F[num];
	long sum=0;
	for(int i=1;i<=num;i++)
	{
		cin>>F[i-1];
		sum=sum+F[i-1];
	}
	int min=F[0],max=F[0];
	for(int i=1;i<=num;i++)
	{
		if(F[i-1]>max) max=F[i-1];
		if(F[i-1]
コンパイル時間0.91 s第2 forサイクルでの比較回数は2 n回
基礎練習整数の検索
時間制限:1.0 sメモリ制限:256.0 MB
問題の説明
n個の整数を含む数列を与え、整数aが数列で最初に現れるのは何番目かを尋ねる.
入力フォーマット
最初の行には整数nが含まれます.
2行目はn個の非負の整数を含み、与えられた数列であり、数列の各数は10000を超えない.
3行目には、検索対象の数の整数aが含まれます.
出力フォーマット
aが数列に現れた場合、最初に現れた位置(位置は1から番号付け)を出力し、そうでなければ-1を出力します.
サンプル入力
6 1 9 4 8 3 9 9
サンプル出力
2
データ規模と約定
1 <= n <= 1000.
#include
using namespace std;
int main()
{
	int num;
	cin>>num;
	int F[num];
	for(int i=1;i<=num;i++)
	{
		cin>>F[i-1];
	}
	int find;
	cin>>find;
	int x;
	for(int i=1;i<=num;i++)
	{
		if(F[i-1]==find)
		{x=i;break;
		}
		else x=-1;
	
	}
	cout<
注意:今回の問題では、breakを追加しないプログラムを追加しなければならない時間に大きな違いがあります.breakを追加しないプログラムは最後の要素に遍歴する必要があります.データ量が大きすぎると、cpuを長期にわたって占有します.
詳しくはhttp://blog.csdn.net/luoweifu/article/details/16369007この大神はbreak文の詳細な説明について
数字の型抜き余剰を求めて、配列を利用して、数字の最大桁数の長さと定義して、それから各数字を利用して異なる配列のシーケンス番号の中で解決します
#include
using namespace std;
int a[6];
int temp = 0;
int palindrome(int n)//n         
{
	int i = 0,j,k;
	while (n >= 1)
	{
		a[i++] = n % 10;
		n = n / 10;
	}
	k = i - 1;
	j = 0;
	while (j < k)
	{
		if (a[j++] != a[k--])
			return 0;
	}
	for (i = 0; i < 6; i++)
	{
		temp = temp + a[i];
	}
	return 1;
}
int main()
{
	int n;
	cin >> n;
	int count = 0;
	for (int i = 10000; i < 1000000; i++)
	{
		temp = 0;
		if (palindrome(i) == 1 && temp == n)
		{
			cout << i << endl;
			count++;
		}
	}
	if (count == 0)
		cout << "-1" << endl;
	//cout << "sum=" << count << endl;
	return 0;
}
//   3   2       2   2        
#include
using namespace std;
int main()
{
	int a[8];

	for(a[0]=1;a[0]<=9;a[0]++)
	{
		for(a[1]=0;a[1]<=9;a[1]++)
		{
			if(a[0]!=a[1])
			for(a[2]=0;a[2]<=9;a[2]++)
			{
				if(a[2]!=a[0]&&a[2]!=a[1])
				for(a[3]=0;a[3]<=9;a[3]++)
				{
					if(a[3]!=a[2]&&a[3]!=a[1]&&a[3]!=a[0])
					for(a[4]=1;a[4]<=9;a[4]++)
					{
						if(a[4]!=a[3]&&a[4]!=a[2]&&a[4]!=a[1]&&a[4]!=a[0])
						for(a[5]=0;a[5]<=9;a[5]++)
						{
							if(a[5]!=a[4]&&a[5]!=a[3]&&a[5]!=a[2]&&a[5]!=a[1]&&a[5]!=a[0])
							for(a[6]=0;a[6]<=9;a[6]++)
							{
							   if(a[6]!=a[5]&&a[6]!=a[4]&&a[6]!=a[3]&&a[6]!=a[2]&&a[6]!=a[1]&&a[6]!=a[0])
							   for(a[7]=0;a[7]<=9;a[7]++)
							  {
							  	if(a[7]!=a[6]&&a[7]!=a[5]&&a[7]!=a[4]&&a[7]!=a[3]&&a[7]!=a[2]&&a[7]!=a[1]&&a[7]!=a[0])
							  	{
							  		int s=a[0]*1000+a[1]*100+a[2]*10+a[3];//  
								    int x=a[4]*1000+a[5]*100+a[6]*10+a[1];
								    int sum=a[4]*10000+a[5]*1000+a[2]*100+a[1]*10+a[7];
								    if(sum==s+x)
								    {
									      cout<
アルゴリズム訓練区間k大数クエリー
問題の説明
1つのシーケンスが与えられ、シーケンスのl番目の数からr番目の数のK番目の数がどれであるかを尋ねるたびに.
入力フォーマット
最初の行には、シーケンスの長さを表す数nが含まれます.
2行目は、与えられたシーケンスを表すn個の正の整数を含む.
3番目は、質問個数を表す正の整数mを含む.
次にm行、各行3個の数l,r,Kは、質問シーケンスが左から右へl番目の数からr番目の数まで、大きいから小さいK番目の数がどれであるかを示す.シーケンス要素は1から始まる.
出力フォーマット
合計m行を出力し、行ごとに1つの数で、質問の答えを表します.
サンプル入力
5
1 2 3 4 5
2
1 5 2
2 3 2
サンプル出力
4
2
データ規模と約定
30%のデータに対して、n,m<=100;
100%のデータに対して、n,m<=1000;
k<=(r−l+1)、シーケンス中の数<=106を保証する.
#include
using namespace std;
int find(int p[], int l, int r, int k)//  l        r    , k     
{
	int m = r - l + 1;//     r-l+1   
	int *newbase = new int[m];//           
	int i, newc = 0;//newc newbase    
	for (i = l - 1; i> n;
	int *p = new int[n];//     n   
	for (int i = 0; i> p[i];
	}
	//find(p, 1, 5, 2);
	int m;//m     
	cin >> m;
	int count = 0;//        
	int *q = new int[m];//  m          
	for (count = 0; count> l >> r >> k;//     
		q[count] = find(p, l, r, k);//  m  
	}
	for (int i = 0; i
分析:
入力フォーマットの最初の行に基づいてn個の数を含み、シーケンスの長さを表す.2行目はn個の正の整数を含み、与えられたシーケンスを表す.
3番目は正の整数mを含み、質問個数の次のm行を表し、各行3個の数l,r,kは、質問シーケンスが左から右へl番目の数のうち、大きいから小さいk番目の数がどれであるかを表す.シリアル番号要素はlから始まる.
 
サンプル出力によれば、mグループに負けた(l,r,k)たちは、各グループのデータの戻り値を格納する必要があることを知ることができるので、関数タイプはvoidではありません.
同様に、実行回数がm回であることを考慮して、mをループします.したがって、入力したパラメータが前の影響を受けないことを保証する必要があります.そのため、指定したデータのコピーを完了するために、新しい配列newbaseを作成します.
ソート法のアルゴリズムを選択するには,外層関数が最初の要素の下から始まることを覚え,今回の最小数を毎回比較し,現在のサイクル数と交換する順序を覚える必要がある.
問題の説明
キュー操作問題.入力された操作コマンドに従って、操作キュー(1)がエンキューされ、(2)がデキューされて出力され、(3)キュー内の要素の個数が計算されて出力される.
入力フォーマット
1行目の数字N.
次のN行は、1行目の数字が操作コマンド(1)のエンキュー、(2)デキューして出力し、(3)キュー内の要素の個数を計算して出力する.
出力フォーマット
複数の行に2または3コマンドの出力結果が表示されます.注意:2.デキューコマンドで空のデキュー(アンダーフロー)が発生する可能性があります.「no」を出力し、終了してください.
サンプル入力
7
1 19
1 56
2
3
2
3
2
サンプル出力
19
1
56
0
no
データ規模と約定
  1<=N<=50
#include
using namespace std;
//  
//  ,   
//       

class queue
{
public:
	queue();
	~queue();
	void push(int &n);
	int pop();
	int length();
	bool empty();
private:
	int *m_base;
	int m_front;
	int m_rear;
	int m_size;
	int m_length;
};
queue::queue()
{
	m_front = m_rear=0;
	m_size = 100;
	m_base = new int[100];
}
queue::~queue()
{
	delete []m_base;
}
int queue::length()
{
	if (m_length>=0)
		return m_length;
	else
		return -1;

}
void queue:: push(int &n)
{
	m_base[m_rear] = n;
	m_rear = (m_rear + 1) % m_size;
	m_length++;
}
int queue::pop()
{

	if (empty() == true)
		return -1;
	int p;
	p = m_front;
    m_front = (m_front + 1) % m_size;
	--m_length;
	return m_base[p];
}
bool queue::empty()
{
	if (m_front == m_rear)return true;
	else
		return false;
}
int main()
{
	int N;
	cin >> N;//    
	int i;//    
	int cmd;//  
	queue que;
	int *b = new int[N];//    
	int *Num = new int[N];//    
	int num;//    
	for (i = 0; i < N; i++)
	{
		cin >> cmd;
		b[i] = cmd;
		if (cmd == 1)
		{
			cin >> num;//
			Num[i] = num;
		}
		else if(cmd==2||cmd==3)
			Num[i] = 0;
	}

	for (i = 0; i < N; i++)
	{
		
		if (b[i] == 1)
		{
			que.push(Num[i]);
		}
		
		else if (b[i] == 2)
		{
			int z;
			z = que.pop();//    que.pop()               pop()  
			if (z >= 0)
				cout << z << endl;
			else
				cout << "no" << endl;
		}
		else  if(b[i] == 3)
		{
				cout << que.length() << endl;	
		}

	}
	return 0;
}

16進数変換10進数
問題の説明
キーボードから8桁以下の正の16進数文字列を入力し、正の10進数に変換して出力します.
注:16進数の10~15は、それぞれ大文字のアルファベットA、B、C、D、E、Fで表されます.
サンプル入力
       FFFF
サンプル出力
      65535
構想数字文字列我々はstringタイプを採用して、配列の各要素は遍歴して探して、配列の要素は2種類に分けることができます---アルファベットと数字はそれぞれ判断して、文字型だから文字を数字に転化してASCIIコードを運用して表します
#include
#include
using namespace std;
int main()
{
	string num;//          
	cin >> num;

	int size = num.size();//       
	if (size>8||num=="FFFFFFFF")//                       
		return 0;


	int i,j;//    i
	int count = 0;
	long long sum=0,z=0;//     
	for (i = size-1,count=0; i>=0,count               (    )              
	{
		if (num[i] >= 'A'&&num[i] < 'Z')//     10   
		{
			long long z= num[i] - 'A' + 10;//       //   8                       long long        long long  64      int  32   
			for (j=0;j             
			}
			sum = sum + z;//      
		}
		else//   !!!!!   else    else if(num[i]>=0&&num[i]<=9)      0
		{
			z = num[i]-'0';
			for (j = 0; j
未名湖のほとりの悩み
ログインしてから試験問題を表示できます.
時間制限:1.0 sメモリ制限:256.0 MB
錦嚢1
錦嚢2
錦嚢3
問題の説明
毎年冬になると、北大未名湖はスケートのいいところです.北京大学のスポーツチームはたくさんのスケート靴を用意したが、人が多すぎて、毎日午後仕事を終えた後、いつもスケート靴が1足も残っていない.
毎朝、レンタルシューズの窓口には長い列ができていますが、返却シューズがあるm個、レンタルシューズが必要なn個があるとします.今の問題は、彼らがどれだけの排出法を持っているかで、スポーツチームがスケート靴を借りられないという気まずい場面を避けることができるということだ.(同じニーズの2人(例えば靴を借りたり返したり)が位置を交換するのは同じレイアウトです)
入力フォーマット
mとnを表す2つの整数
出力フォーマット
行列の並べ替えのシナリオ数を表す整数.
サンプル入力
3 2
サンプル出力
5
データ規模と約定
  m,n∈[0,18]
もんだいぶんせき
#include
using namespace std;
int f(int m,int n)
{
	if(m>m>>n;
	cout<