最近從同學那得知洛谷,然後開始進駐洛谷,來試圖進階,卡在原地不動太難受。不進反退更難受。看我這菜雞水平,只能打打普及場。弄完普及,再去嘗試提高吧。感覺普及對我都有點難度了。果然是自己水平太菜了。
簡單的模擬(關卡2-1)
P1003 鋪地毯
題目描述
爲了準備一個獨特的頒獎典禮,組織者在會場的一片矩形區域(可看做是平面直角座標系的第一象限)鋪上一些矩形地毯。一共有 nn 張地毯,編號從 11 到nn。現在將這些地毯按照編號從小到大的順序平行於座標軸先後鋪設,後鋪的地毯覆蓋在前面已經鋪好的地毯之上。
地毯鋪設完成後,組織者想知道覆蓋地面某個點的最上面的那張地毯的編號。注意:在矩形地毯邊界和四個頂點上的點也算被地毯覆蓋。
輸入格式
輸入共n+2n+2行
第一行,一個整數nn,表示總共有nn張地毯
接下來的nn行中,第 i+1i+1行表示編號ii的地毯的信息,包含四個正整數a ,b ,g ,ka,b,g,k ,每兩個整數之間用一個空格隔開,分別表示鋪設地毯的左下角的座標(a,b)(a,b)以及地毯在xx軸和yy軸方向的長度
第n+2n+2行包含兩個正整數xx和yy,表示所求的地面的點的座標(x,y)(x,y)
輸出格式
輸出共11行,一個整數,表示所求的地毯的編號;若此處沒有被地毯覆蓋則輸出-1−1
思路分析:
起初我想要定個數組模擬一遍,發現自己果然是頭腦簡單,既卡內存又卡時間。其實有個很取巧的方法,把信息先存起來,不去模擬作圖,然後倒序反推,看每條信息是否容括了那個點,因爲是取最上層的地毯,所以倒序推就好,找到就退出去就ok了。
#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <string.h>
#include <stack>
#include <map>
using namespace std;
#define ll long long
#define fo(i, a, b) for (int i = a; i < b; i++)
#define foo(i, a, b) for (int i = a; i > b; i--)
#define mst(a, b) memset(a, b, sizeof(a))
const ll maxn = 2e5 + 5;
#define fin freopen("in.txt", "r", stdin)
int arr[10005][5];
int main()
{
//fin;
// ios::sync_with_stdio(0);
int n;
cin >> n;
fo(k, 1, n + 1)
{
fo(i, 1, 5)
cin >>arr[k][i];
}
int x,y;
cin >> x >> y;
bool flag = false;
foo(k, n, -1)
{
if (x >= arr[k][1] && x <= (arr[k][3]+arr[k][1]) && y >= arr[k][2] && y <= (arr[k][4]+arr[k][2]))
{
cout << k << endl;
flag = 1;
break;
}
}
if (!flag)
{
cout << "-1\n";
}
}
P1067 多項式輸出
題目描述
一元nn次多項式可用如下的表達式表示:
f(x)=a_nx^n+a_{n-1}x^{n-1}+\cdots +a_1x+a_0,a_n\ne 0f(x)=anxn+an−1xn−1+⋯+a1x+a0,an≠0
其中,a_ix^iaixi稱爲ii次項,a_iai 稱爲ii次項的係數。給出一個一元多項式各項的次數和係數,請按照如下規定的格式要求輸出該多項式:
-
多項式中自變量爲xx,從左到右按照次數遞減順序給出多項式。
-
多項式中只包含係數不爲00的項。
-
如果多項式nn次項係數爲正,則多項式開頭不出現“+”號,如果多項式nn次項係數爲負,則多項式以“-”號開頭。
對於不是最高次的項,以“+”號或者“-”號連接此項與前一項,分別表示此項係數爲正或者係數爲負。緊跟一個正整數,表示此項係數的絕對值(如果一個高於00次的項,其係數的絕對值爲11,則無需輸出 11)。如果xx的指數大於11,則接下來緊跟的指數部分的形式爲“x^bxb”,其中 bb爲 xx的指數;如果 xx的指數爲11,則接下來緊跟的指數部分形式爲“xx”;如果 xx 的指數爲00,則僅需輸出係數即可。
多項式中,多項式的開頭、結尾不含多餘的空格。
輸入格式
輸入共有 22 行
第一行11 個整數,nn,表示一元多項式的次數。
第二行有 n+1n+1個整數,其中第ii個整數表示第n-i+1n−i+1 次項的係數,每兩個整數之間用空格隔開。
輸出格式
輸出共 11 行,按題目所述格式輸出多項式。
思路分析
這題卡了好多次,因爲一開始思路不是很清晰,就直接上手了,細節處理起來給我整懵了。建議沒有想好思路,不要下手。切勿邊敲邊想這類的細節題。
#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <string.h>
#include <stack>
#include <map>
using namespace std;
#define ll long long
#define fo(i, a, b) for (int i = a; i < b; i++)
#define foo(i, a, b) for (int i = a; i > b; i--)
#define mst(a, b) memset(a, b, sizeof(a))
const ll maxn = 2e5 + 5;
#define fin freopen("in.txt", "r", stdin)
int arr[105];
int main()
{
//fin;
// ios::sync_with_stdio(0);
int n;
cin >> n;
foo(i, n, -1)
{
cin >> arr[i];
}
foo(i, n, 0)
{
if (arr[i])
{
if (i == n ) //第一項
{
if (arr[i] == 1)
cout<<"x^"<<i;
else if(arr[i]==-1)
cout << "-x^" << i;
else
{
cout <<arr[i]<< "x^" << i;
}
}
else if (i > 1)
{
if (arr[i] == 1)
cout << "+x^" << i;
else if (arr[i] == -1)
cout << "-x^" << i;
else{if(arr[i]>0)
cout<<'+';
cout << arr[i] << "x^" << i;
}
}
else if (i == 1)
{
if (arr[i]==1)
cout << '+'<< 'x';
else if(arr[i]==-1)
cout<<"-x";
else
{
if(arr[i]>0)
cout<<'+';
cout<<arr[i]<<"x";
}
}
}
}
if (arr[0])
{
if (arr[0] > 0 && n != 0)
cout << '+';
cout << arr[0];
}
}
P1540 機器翻譯
題目描述
這個翻譯軟件的原理很簡單,它只是從頭到尾,依次將每個英文單詞用對應的中文含義來替換。對於每個英文單詞,軟件會先在內存中查找這個單詞的中文含義,如果內存中有,軟件就會用它進行翻譯;如果內存中沒有,軟件就會在外存中的詞典內查找,查出單詞的中文含義然後翻譯,並將這個單詞和譯義放入內存,以備後續的查找和翻譯。
假設內存中有MM個單元,每單元能存放一個單詞和譯義。每當軟件將一個新單詞存入內存前,如果當前內存中已存入的單詞數不超過M-1M−1,軟件會將新單詞存入一個未使用的內存單元;若內存中已存入MM個單詞,軟件會清空最早進入內存的那個單詞,騰出單元來,存放新單詞。
假設一篇英語文章的長度爲NN個單詞。給定這篇待譯文章,翻譯軟件需要去外存查找多少次詞典?假設在翻譯開始前,內存中沒有任何單詞。
輸入格式
共22行。每行中兩個數之間用一個空格隔開。
第一行爲兩個正整數M,NM,N,代表內存容量和文章的長度。
第二行爲NN個非負整數,按照文章的順序,每個數(大小不超過10001000)代表一個英文單詞。文章中兩個單詞是同一個單詞,當且僅當它們對應的非負整數相同。
輸出格式
一個整數,爲軟件需要查詞典的次數。
輸入輸出樣例
輸入 #1
3 7
1 2 1 5 4 4 1
輸出 #1
5
說明/提示
每個測試點1s1s
對於10\%10%的數據有M=1,N≤5M=1,N≤5。
對於100\%100%的數據有0≤M≤100,0≤N≤10000≤M≤100,0≤N≤1000。
整個查字典過程如下:每行表示一個單詞的翻譯,冒號前爲本次翻譯後的內存狀況:
空:內存初始狀態爲空。
1.11:查找單詞1並調入內存。
2. 1 212:查找單詞22並調入內存。
3. 1 212:在內存中找到單詞11。
4. 1 2 5125:查找單詞55並調入內存。
5. 2 5 4254:查找單詞44並調入內存替代單詞11。
6.2 5 4254:在內存中找到單詞44。
7.5 4 1541:查找單詞1並調入內存替代單詞22。
共計查了55次詞典。
思路分析
這題還是比較簡單的,模擬一下隊列就好了。不過我寫的還是過於冗長了,有更節省時間和空間的思路。
有個地方不解的是,我數組如果開1005,就會wa掉第六個數據,開1010就好了。看大神的代碼也都只開到1005。
#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <string.h>
#include <stack>
#include <map>
#include<queue>
using namespace std;
#define ll long long
#define fo(i, a, b) for (int i = a; i < b; i++)
#define foo(i, a, b) for (int i = a; i > b; i--)
#define mst(a, b) memset(a, b, sizeof(a))
const ll maxn = 2e5 + 5;
#define fin freopen("in.txt", "r", stdin)
int main()
{
//fin;
// ios::sync_with_stdio(0);
int m,n;
int Myqueue[1010];
int fir,back;
fir=back=1;
cin>>m>>n;
int data;
int num_check=0;
fo(i,0,n)
{
cin>>data;
bool flag=false;
fo(k,fir,back+1)
{
if(Myqueue[k]==data)//找到單詞
{flag=true; break;}
}
if(!flag)
{
num_check++;
if(back-fir<m)// poor
{
Myqueue[back++]=data;
}
else //enough
{
fir++;
Myqueue[back++]=data;
}
}
/*fo(i,fir,back)
{
cout<<Myqueue[i]<<' ';
}
cout<<fir<<"->"<<back<<endl;*/
}
cout<<num_check<<endl;
return 0;
}
P1328 生活大爆炸版石頭剪刀布
題目描述
石頭剪刀布是常見的猜拳遊戲:石頭勝剪刀,剪刀勝布,布勝石頭。如果兩個人出拳一 樣,則不分勝負。在《生活大爆炸》第二季第8集中出現了一種石頭剪刀布的升級版遊戲。
升級版遊戲在傳統的石頭剪刀布遊戲的基礎上,增加了兩個新手勢:
斯波克:《星際迷航》主角之一。
蜥蜴人:《星際迷航》中的反面角色。
這五種手勢的勝負關係如表一所示,表中列出的是甲對乙的遊戲結果。
現在,小 A
和小 B
嘗試玩這種升級版的猜拳遊戲。已知他們的出拳都是有周期性規律的,但週期長度不一定相等。例如:如果小A
以“石頭-布-石頭-剪刀-蜥蜴人-斯波克”長度爲 66 的週期出拳,那麼他的出拳序列就是“石頭-布-石頭-剪刀-蜥蜴人-斯波克-石頭-布-石頭-剪刀-蜥蜴人-斯波克-......”,而如果小B
以“剪刀-石頭-布-斯波克-蜥蜴人”長度爲 55 的週期出拳,那麼他出拳的序列就是“剪刀-石頭-布-斯波克-蜥蜴人-剪刀-石頭-布-斯波克-蜥蜴人-......”
已知小 A
和小 B
一共進行 NN 次猜拳。每一次贏的人得 11 分,輸的得 00 分;平局兩人都得 00 分。現請你統計 NN 次猜拳結束之後兩人的得分。
輸入格式
第一行包含三個整數:N,N_A,N_BN,NA,NB,分別表示共進行 NN 次猜拳、小 A
出拳的週期長度,小 B
出拳的週期長度。數與數之間以一個空格分隔。
第二行包含 N_ANA 個整數,表示小 A
出拳的規律,第三行包含 N_BNB 個整數,表示小 B
出拳的規律。其中,00 表示“剪刀”,11 表示“石頭”,22 表示“布”,33 表示“蜥蜴人”,44表示“斯波克”。數與數之間以一個空格分隔。
輸出格式
輸出一行,包含兩個整數,以一個空格分隔,分別表示小 A
、小 B
的得分。
輸入輸出樣例
輸入 #1複製
10 5 6 0 1 2 3 4 0 3 4 2 1 0
輸出 #1複製
6 2
輸入 #2複製
9 5 5 0 1 2 3 4 1 0 3 2 4
輸出 #2複製
4 4
說明/提示
對於100\%100%的數據,0 < N \leq 200, 0 < N_A \leq 200, 0 < N_B \leq 2000<N≤200,0<NA≤200,0<NB≤200 。
思路分析
這題我起初是想要用函數判斷模擬一遍,寫到一半發現太麻煩了。就重新想了想。發現可以做一張得分表,在模擬一次就ok了
#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <string.h>
#include <stack>
#include <map>
#include<queue>
using namespace std;
#define ll long long
#define fo(i, a, b) for (int i = a; i < b; i++)
#define foo(i, a, b) for (int i = a; i > b; i--)
#define mst(a, b) memset(a, b, sizeof(a))
const ll maxn = 2e5 + 5;
#define fin freopen("in.txt", "r", stdin)
int sore[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 main()
{
int a[205],b[205];
//fin;
// ios::sync_with_stdio(0);
int n,alen,blen;
int asore,bsore;
asore=bsore=0;
cin>>n>>alen>>blen;
fo(i,0,alen)
cin>>a[i];
fo(i,0,blen)
cin>>b[i];
fo(i,0,n)
{
if(sore[a[i%alen]][b[i%blen]])
asore++;
else if(a[i%alen]!=b[i%blen])
bsore++;
}
cout<<asore<<' '<<bsore<<endl;
return 0;
}