15行代码AC_ 【蓝桥杯】兴趣小组(解题报告+思考)
勵志用更少的代碼做更高效的表達
問題描述:
為豐富同學們的業余文化生活,某高校學生會創辦了3個興趣小組
(以下稱A組,B組,C組)。
每個小組的學生名單分別在【A.txt】,【B.txt】和【C.txt】中。
每個文件中存儲的是學生的學號。
由于工作需要,我們現在想知道:
既參加了A組,又參加了B組,但是沒有參加C組的同學一共有多少人?
請你統計該數字并通過瀏覽器提交答案。
注意:答案是一個整數,不要提交任何多余的內容。
思路整理
本題的思路很簡單, A組數據與B組數據做交集, 得到D組數據, 與C組數據做交集, 最后D-C為正解。
但如何將數據放入容器,再求交集呢?難點有二,其一是如何開辟數組,其二是如何將數據錄入數組。
幾種思路分析:
1 最簡便的方法當然是使用java, 形如:int a[] = {...} 直接動態開辟數組,無需計算數組的長度 , 香爆了!
2 使用word做字符替換,查找出每組數據的個數, (word統計出現次數的用法見這篇博客——>傳送門1)從而開辟數組的空間,使用scanf()或直接賦值的方法得到數據數組。
3 還有一種很巧妙的思路, 我們可以人為的輸入某些值, 來代表一組數據錄入的結束。 比如:使用while循環做輸入, 當識別到-1時, 代表輸入一組數據的結束, 這樣就可以非常方便的錄入三組數據!
注意:
1 若使用scanf輸入數據, 要注意scanf("%d,", &x), 逗號后面沒有空格, 否則會要求我們多輸入一個數據。也就是scanf的吃空格行為。具體原因和解釋見這篇博客——>傳送門2
2 不用擔心前導零的影響, 因為用int做輸入時會忽略前導零。
代碼展示了一種非常巧妙的方法, 也就是基于思路3的用法。 只用了15行代碼就解決了問題!
代碼展示
#include <bits/stdc++.h> using namespace std; const int maxn=1e8+10; bool book[3][maxn]; int main() {int i,val,cur,ans;cur=0;while(scanf("%d,",&val)!=EOF)if(val==-1) cur++;else book[cur][val]=1;ans=0;for(i=0;i<100000000;i++)if(book[0][i]&&book[1][i]&&!book[2][i]) ans++;printf("%d\n",ans); return 0; }輸出結果: 20
最重要的一點,我們的目的是解題, 不是炫技! 實用才是王道!
總結
以上是生活随笔為你收集整理的15行代码AC_ 【蓝桥杯】兴趣小组(解题报告+思考)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 13行代码AC_2017年省赛C组蓝桥杯
- 下一篇: 【已解决】scanf语句中%d后面多加一