我能超神
2018.9.17
題面(from luogu)
多項式的輸出
一進制n次多項式可用如下的表達式表示:
其中,a_i·x^i 稱為i次項,a_i稱為i 次項的系數。給出一個一進制多項式各項的次數和系數,請按照如下規定的格式要求輸出該多項式:
- 多項式中自變量為x,從左到右按照次數遞減順序給出多項式。删除線格式
- 多項式中隻包含系數不為0 的項。
- 如果多項式n 次項系數為正,則多項式開頭不出現“+”号,如果多項式n 次項系數為負,則多項式以“-”号開頭。
- 對于不是最高次的項,以“+”号或者“-”号連接配接此項與前一項,分别表示此項系數為正或者系數為負。緊跟一個正整數,表示此項系數的絕對值(如果一個高于0 次的項,其系數的絕對值為1,則無需輸出1)。如果x 的指數大于1,則接下來緊跟的指數部分的形式為“x^b”,其中b 為x 的指數;如果x 的指數為1,則接下來緊跟的指數部分形式為“x”;如果x 的指數為0,則僅需輸出系數即可。
- 多項式中,多項式的開頭、結尾不含多餘的空格。
【資料範圍】
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集中出現了一種石頭剪刀布的更新版遊戲。
更新版遊戲在傳統的石頭剪刀布遊戲的基礎上,增加了兩個新手勢:
斯波克:《星際迷航》主角之一。
蜥蜴人:《星際迷航》中的反面角色。
這五種手勢的勝負關系如表一所示,表中列出的是甲對乙的遊戲結果。
現在,小 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;
}