天天看點

noip2018模拟練習計劃

我能超神

2018.9.17

題面(from luogu)

多項式的輸出

一進制n次多項式可用如下的表達式表示:

noip2018模拟練習計劃

其中,a_i·x^i 稱為i次項,a_i稱為i 次項的系數。給出一個一進制多項式各項的次數和系數,請按照如下規定的格式要求輸出該多項式:

  1. 多項式中自變量為x,從左到右按照次數遞減順序給出多項式。删除線格式
  2. 多項式中隻包含系數不為0 的項。
  3. 如果多項式n 次項系數為正,則多項式開頭不出現“+”号,如果多項式n 次項系數為負,則多項式以“-”号開頭。
  4. 對于不是最高次的項,以“+”号或者“-”号連接配接此項與前一項,分别表示此項系數為正或者系數為負。緊跟一個正整數,表示此項系數的絕對值(如果一個高于0 次的項,其系數的絕對值為1,則無需輸出1)。如果x 的指數大于1,則接下來緊跟的指數部分的形式為“x^b”,其中b 為x 的指數;如果x 的指數為1,則接下來緊跟的指數部分形式為“x”;如果x 的指數為0,則僅需輸出系數即可。
  5. 多項式中,多項式的開頭、結尾不含多餘的空格。

【資料範圍】

1 ≤ n ≤ 100,多項式各次項系數的絕對值均不超過100。

輸入格式

共有2 行。

第一行 1 個整數,n,表示一進制多項式的次數。

第二行有 n+1 個整數,其中第i 個整數表示第n-i+1 次項的系數,每兩個整數之間用空

輸出格式

共1 行,按題目所述格式輸出多項式。

【輸入樣例1】

5

100 -1 1 -3 0 10

【輸出樣例1】

100x5-x4+x3-3x2+10

【輸入樣例2】

3

-50 0 0 1

【輸出樣例2】

-50x^3+1

反思:要多注意對分類讨論的思考

代碼:

#include <bits/stdc++.h>
using namespace std;

int a[110],n;

int main()
{
	cin>>n;
	for (int i = n+1; i >= 1; i--)
		cin>>a[i];
	
	if (a[n+1] == 1) cout<<"x^"<<n;          //頭
		else
	if (a[n+1] == -1) cout<<'-'<<"x^"<<n;
		else
			cout<<a[n+1]<<"x^"<<n;
			
	for (int i = n; i >= 3; i--)       //中間
		{
			if (a[i] == 0) continue;
				else
			if (abs(a[i]) != 1)
				{
					if (a[i] > 0) cout<<'+'<<a[i]<<"x^"<<i-1;
						else
					if (a[i] < 0) cout<<a[i]<<"x^"<<i-1;
				}
				else
			if (a[i] < 0) cout<<'-'<<"x^"<<i-1;
				else
					cout<<'+'<<"x^"<<i-1;
		}	
		
	if (a[2] == -1) cout<<'-'<<"x";     //尾
		else
	if (a[2] == 1) cout<<'+'<<"x";
		else
	if (a[2] > 0) cout<<'+'<<a[2]<<"x";
		else
	if (a[2] != 0) cout<<a[2]<<"x";
	
	if (a[1] > 0) cout<<'+'<<a[1];
		else
		if (a[1] < 0) cout<<a[1];

return 0;
           

要堅持住刷題,争取在聯賽中秒殺第一,二題!

加油!

2018.9.18

題面(form luogu)

生活大爆炸版石頭剪刀布

石頭剪刀布是常見的猜拳遊戲:石頭勝剪刀,剪刀勝布,布勝石頭。如果兩個人出拳一 樣,則不分勝負。在《生活大爆炸》第二季第8集中出現了一種石頭剪刀布的更新版遊戲。

更新版遊戲在傳統的石頭剪刀布遊戲的基礎上,增加了兩個新手勢:

斯波克:《星際迷航》主角之一。

蜥蜴人:《星際迷航》中的反面角色。

這五種手勢的勝負關系如表一所示,表中列出的是甲對乙的遊戲結果。

noip2018模拟練習計劃

現在,小 A和小 B嘗試玩這種更新版的猜拳遊戲。已知他們的出拳都是有周期性規律的,但周期長度不一定相等。例如:如果小A以“石頭-布-石頭-剪刀-蜥蜴人-斯波克”長度為 6 的周期出拳,那麼他的出拳序列就是“石頭-布-石頭-剪刀-蜥蜴人-斯波克-石頭-布-石頭-剪刀-蜥蜴人-斯波克-…”,而如果小B以“剪刀-石頭-布-斯波克-蜥蜴人”長度為 5 的周期出拳,那麼他出拳的序列就是“剪刀-石頭-布-斯波克-蜥蜴人-剪刀-石頭-布-斯波克-蜥蜴人-…”

已知小 A和小 B 一共進行 N 次猜拳。每一次赢的人得 1 分,輸的得 0 分;平局兩人都得 0 分。現請你統計 N 次猜拳結束之後兩人的得分。

輸入輸出格式

輸入格式:

第一行包含三個整數:N,N_A,N_B,分别表示共進行 N 次猜拳、小 A出拳的周期長度,小 B 出拳的周期長度。數與數之間以一個空格分隔。

第二行包含 N_A個整數,表示小 A出拳的規律,第三行包含 N_B個整數,表示小 B 出拳的規律。其中,00 表示“剪刀”,1 表示“石頭”,2 表示“布”,3 表示“蜥蜴人”,4表示“斯波克”。數與數之間以一個空格分隔。

輸出格式:

輸出一行,包含兩個整數,以一個空格分隔,分别表示小 A、小 B的得分。

樣例1.in

10 5 6

0 1 2 3 4

0 3 4 2 1 0

樣例1.out

6 2

樣例2.in

9 5 5

0 1 2 3 4

1 0 3 2 4

樣例2.out

4 4

對于%100%的資料,0<N_A ≤ 200, 0<N_B200, 0<N≤200, 0<N_B≤200 。

反思:注意對分類讨論的綜合簡化處理,加強自己的思維強度

代碼:

#include <bits/stdc++.h>
using namespace std;

int PK[5][5] = {{0,0,1,1,0},         //綜合簡化打表,雙向的
			   {1,0,0,1,0},
			   {0,1,0,0,1},
			   {0,0,1,0,1},
			   {1,1,0,0,0}};
int a1[210],b1[210],a[210],b[210];
int na,nb,n;

int main()
{
	cin>>n>>na>>nb;
	for (int i = 1; i <= na; i++)
		cin>>a1[i];
	for (int i = 1; i <= nb; i++)
		cin>>b1[i];
	
	//模拟出類題中的線性表
	int da=1;
	int db=1;
	for (int i = 1; i <= n; i++)
		{
			if (da > na) da = 1;
			if (db > nb) db = 1;
			
			a[i] = a1[da];
			da++;
			b[i] = b1[db];
			db++;
		}
		
	//綜合判斷
	da = 0;
	db = 0;
	for (int i = 1; i <= n; i++)
		{
			if (a[i] == b[i]) continue;
			
			da+=PK[a[i]][b[i]];
			db+=PK[b[i]][a[i]];
		}
		
	cout<<da<<" "<<db;

	return 0;
} 
           

2018.10.16

題面(from luogu)

圖書管理者

圖書館中每本書都有一個圖書編碼,可以用于快速檢索圖書,這個圖書編碼是一個 正整數。 每位借書的讀者手中有一個需求碼,這個需求碼也是一個正整數。如果一本書的圖 書編碼恰好以讀者的需求碼結尾,那麼這本書就是這位讀者所需要的。 小 D 剛剛當上圖書館的管理者,她知道圖書館裡所有書的圖書編碼,她請你幫她寫 一個程式,對于每一位讀者,求出他所需要的書中圖書編碼最小的那本書,如果沒有他 需要的書,請輸出-1。

輸入格式:

第一行,包含兩個正整數 n,q,以一個空格分開,分别代表圖書館裡 書的數量和讀者的數量。

接下來的 n 行,每行包含一個正整數,代表圖書館裡某本書的圖書編碼。

接下來的 q 行,每行包含兩個正整數,以一個空格分開,第一個正整數代表圖書館 裡讀者的需求碼的長度,第二個正整數代表讀者的需求碼。

輸出格式:

q 行,每行包含一個整數,如果存在第 i 個讀者所需要的書,則在第 ii 行輸出第 ii 個讀者所需要的書中圖書編碼最小的那本書的圖書編碼,否則輸出-1。

輸入樣例#1:

5 5

2123

1123

23

24

24

2 23

3 123

3 124

2 12

2 12

輸出樣例#1:

23

1123

-1

-1

-1

【資料規模與約定】

對于 20%的資料,1 ≤ n ≤ 2。

另有 20%的資料,q = 1。

另有 20%的資料,所有讀者的需求碼的長度均為 1。

另有 20%的資料,所有的圖書編碼按從小到大的順序給出。

對于 100%的資料,1 ≤ n ≤ 1,000,1 ≤ q ≤ 1,000,所有的圖書編碼和需求碼均 不超過 10,000,000。

反思:要加強自己調代碼的恒心,要看清楚題面

代碼

#include <bits/stdc++.h>
using namespace std;

long a[1009],b[1009],tmp[1009],n,q;

int main()
{
	bool judgea = true;
	int k;
	
	cin>>n>>q;
	for (int i = 1; i <= n; i++)
		cin>>a[i];
		
	for (int i = 1; i <= q; i++)
		{
			cin>>k>>b[i];
			
			tmp[i] = 1;
			for (int j = 1; j <= k; j++)	tmp[i] *=10;          //算出這一串編碼的所占長度
		}
		
	sort(a+1,a+n+1);
//	for (int i = 1; i <= n; i++) cout<<a[i]<<' ';
//	cout<<endl;
	
	for (int i = 1; i <= q; i++)
		{
			judgea = true;
			
			for (int j = 1; j <= n; j++)
					if  (a[j] % tmp[i] == b[i])           //去最後一位
						{
							judgea = false;
						
							cout<<a[j]<<endl;
						
							break;
						}
			
			if (judgea) cout<<"-1"<<endl;
		}

	return 0;
}
           

繼續閱讀