【Week 11 作业】必做题
Week 11 必做題
- A 必做題 1
- 題目描述
- 輸入格式
- 輸出格式
- 輸入樣例
- 輸出樣例
- 思路
- 代碼
- B 必做題 2
- 題目描述
- 輸入格式
- 輸出格式
- 數據范圍
- 樣例輸入
- 樣例輸出
- 思路
- 代碼
- C 必做題 3
- 題目描述
- 輸入格式
- 輸出格式
- 樣例輸入
- 樣例輸出
- 思路
- 代碼
- D 必做題 4
- 題目描述
- 輸入格式
- 輸出格式
- 樣例
- 樣例輸入1
- 樣例輸出1
- 樣例輸入2
- 樣例輸出2
- 樣例輸入3
- 樣例輸出3
- 思路
- 代碼
A 必做題 1
題目描述
蒜頭君從現在開始工作,年薪 N 萬。他希望在蒜廠附近買一套 60 平米的房子,現在價格是 200 萬。假設房子價格以每年百分之 K 增長,并且蒜頭君未來年薪不變,且不吃不喝,不用交稅,每年所得 N 萬全都積攢起來,問第幾年能夠買下這套房子?(第一年年薪 N 萬,房價 200 萬)
輸入格式
一行,包含兩個正整數 N(10≤N≤50),K(1≤K≤20),中間用單個空格隔開。
輸出格式
如果在第 20 年或者之前就能買下這套房子,則輸出一個整數 M,表示最早需要在第 M 年能買下;否則輸出"Impossible"。輸出時每行末尾的多余空格,不影響答案正確性
輸入樣例
50 10輸出樣例
8思路
從第一年開始循環計算當年總收入與當年的房價,直到年數超過20年或者總收入大于房價停止循環。
循環結束后,若年數小于20,說明在20年內某一年總收入大于房價,則輸出年數即可,若年數大于20,則說明20年內每一年房價都比總收入大,則輸出“Impossible”。
代碼
#include <iostream> using namespace std; int N,K; int main(int argc, char** argv) {scanf("%d%d",&N,&K);int i=1;int sum=N;double pay=200;while(i<=20&&sum<pay){i++;sum+=N;pay+=(pay/100)*K;}if(i<=20)printf("%d\n",i);elseprintf("Impossible\n");return 0; }B 必做題 2
題目描述
蒜頭君的班級里有 n^2 個同學,現在全班同學已經排列成一個 n?n 的方陣。
但是老師卻臨時給出了一組新的列隊方案。
為了方便列隊,所以老師只關注這個方陣中同學的性別,不看具體的人是誰這里我們用 0 表示男生,用 1 表示女生。
現在蒜頭君告訴你同學們已經排好的方陣是什么樣的,再告訴你老師希望的方陣是什么樣的,他想知道同學們已經列好的方陣能否通過順時針旋轉變成老師希望的方陣
1、不需要旋轉則輸出 0
2、順時針旋轉 90° 則輸出 1
3、順時針旋轉 180° 則輸出 2
4、順時針旋轉 270° 則輸出 3
若不滿足以上四種情況則輸出 ?1若滿足多種情況,則輸出較小的數字。
輸入格式
第一行為一個整數 n
接下來的 n 行同學們已經列好的 01 方陣;
再接下來的 n 行表示老師希望的的 01 方陣。
輸出格式
輸出僅有一行,該行只有一個整數,如題所示。
數據范圍
對于 100% 的數據中,1≤n≤20,輸出時每行末尾的多余空格,不影響答案正確性
樣例輸入
4 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0樣例輸出
1思路
首先將輸入保存到兩個數組之中,接下來就是如何旋轉數組。
對數組進行90°,180°,270°旋轉后的結果,可看成是更改一下數組每個數的下標,因此我們可以直接改變數組的遍歷方式,已到達與旋轉相同的效果,如旋轉90°,即將n列反向后變成第n行,因此改成從第一列的最后一個向上遍歷,從第一列向后遍歷即可…依據這種思想,我們可直接使用原始數組,對要旋轉的數組采用不同的遍歷方式來與目標數組(目標數組采用普通的遍歷方式即可)比較即可判斷旋轉后是否匹配。
代碼
#include <iostream> using namespace std; const int Size=20+5; int s[Size][Size]; int t[Size][Size]; int N; bool r0() {for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)if(s[i][j]!=t[i][j])return false;return true; } bool r90() {for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)if(t[i][j]!=s[N-j+1][i])return false;return true; } bool r180() {for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)if(t[i][j]!=s[N-i+1][N-j+1])return false;return true; } bool r270() {for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)if(t[i][j]!=s[j][N-i+1])return false;return true; } int main(int argc, char** argv) {scanf("%d",&N);for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)scanf("%d",&s[i][j]);for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)scanf("%d",&t[i][j]);int flag=-1;if(r0())flag=0;else if(r90())flag=1;else if(r180())flag=2;else if(r270())flag=3;printf("%d\n",flag);return 0; }C 必做題 3
題目描述
Julius Caesar 曾經使用過一種很簡單的密碼。對于明文中的每個字符,將它用它字母表中后 5 位對應的字符來代替,這樣就得到了密文。比如字符’A’用’F’來代替。如下是密文和明文中字符的對應關系。
密文
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z明文
V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
你的任務是對給定的密文進行解密得到明文。你需要注意的是,密文中出現的字母都是大寫字母。密文中也包括非字母的字符,對這些字符不用進行解碼。
輸入格式
一行,給出密文,密文不為空,而且其中的字符數不超過 200。
輸出格式
輸出一行,即密文對應的明文。
輸出時每行末尾的多余空格,不影響答案正確性
樣例輸入
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX樣例輸出
IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES思路
首先將密文讀入到一個char數組之中,遍歷每一個字符,若其為大寫字母則需轉換為明文,這里密文轉明文是一種類似環狀結構中向前移5的操作,若該字符在F之后,則直接減5即可,若其在F之前,則同樣需向前減5,不過小于A的時候需轉到Z來操作。
代碼
#include <iostream> #include<string.h> using namespace std; const int size=200+10; char str[size]; int main(int argc, char** argv) {while(scanf("%[^\n]",str)!=EOF){int len=strlen(str);for(int i=0;i<len;i++){if(str[i]>='A'&&str[i]<='Z'){if(str[i]>='F')str[i]=str[i]-5;else{str[i]='Z'-(5-(str[i]-'A'+1));}}}for(int i=0;i<len;i++)printf("%c",str[i]);printf("\n");getchar();}return 0; }D 必做題 4
題目描述
東東和他的女朋友(幻想的)去壽司店吃晚餐(在夢中),他發現了一個有趣的事情,這家餐廳提供的 n 個的壽司被連續的放置在桌子上 (有序),東東可以選擇一段連續的壽司來吃。
東東想吃鰻魚,但是東妹想吃金槍魚。核 平 起 見,他們想選擇一段連續的壽司(這段壽司必須滿足金槍魚的數量等于鰻魚的數量,且前一半全是一種,后一半全是另外一種)我們用1代表鰻魚,2代表金槍魚。
比如,[2,2,2,1,1,1]這段序列是合法的,[1,2,1,2,1,2]是非法的。因為它不滿足第二個要求。
東東希望你能幫助他找到最長的一段合法壽司,以便自己能吃飽。
輸入格式
第一行:一個整數n(2≤n≤100000),壽司序列的長度。
第二行:n個整數(每個整數不是1就是2,意義如上所述)
輸出格式
輸出:一個整數(代表東東可以選擇的最長的一段連續的且合法的壽司)
樣例
樣例輸入1
7 2 2 2 1 1 2 2樣例輸出1
4樣例輸入2
6 1 2 1 2 1 2樣例輸出2
2樣例輸入3
9 2 2 1 1 1 2 2 2 2樣例輸出3
6思路
對于可選中的子序列,必須前一半均為一種,后一半均為另一種,所以這里對數據進行了預處理,將數字相同的子序列進行合并,記錄其數量。
如 2 2 2 1 1 1這一段原始數組,處理后為3 3
表示有3個數字相同的子序列,之后又有三個數字相同的子序列。
所以原數組變成了表示一段相同數字的子序列的長度數組。因為原數組中不是1就是2,所以處理后的數組相鄰的必代表不同的數字1或2,若數字相同,則必然在預處理的時候合并了。
處理結束后,對于兩個相鄰的數字a,b,局部可取到的最長序列長度為2*min(a,b),遍歷處理后的數組,即可取到所求的最長子序列。
代碼
#include <iostream> using namespace std; const int size=1e5+10; int note[size]; int tot=-1; int N; int Max[size]; int solve() {int last=note[0];Max[++tot]=0;for(int i=0;i<N;i++)if(note[i]==last)Max[tot]++;else{Max[++tot]=1;last=note[i];}int ans=0;for(int i=1;i<=tot;i++){int temp=2*min(Max[i],Max[i-1]);ans=max(ans,temp);}return ans; } int main(int argc, char** argv) {scanf("%d",&N);for(int i=0;i<N;i++)scanf("%d",¬e[i]);int ans=solve();printf("%d\n",ans);return 0; }總結
以上是生活随笔為你收集整理的【Week 11 作业】必做题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VMware共享文件夹报错 解决方法
- 下一篇: 第十七届全国大学生智能车竞赛华南赛区比赛