牛客小白赛190615场
夜色已經很晚了,所以我長話短說
1.表單
?
鏈接:https://ac.nowcoder.com/acm/contest/917/C
來源:牛客網
輸入描述:
第一行兩個整數n,Q后n行每行一個字符串
后Q行每行代表一個操作:
一操作:1 s
二操作:2
輸出描述:
對于每個二操作,進行回答。 示例1輸入
復制 4 4 play the pubg game 1 game 1 pubg 2 2輸出
復制 2 0說明
100%?1≤n,Q≤5×105100%?1≤n,Q≤5×105 對于所有輸入的字符串長度<=40
這個鏈接不錯,讓我在做題的時候啟蒙了
https://blog.csdn.net/zhaohuaonline/article/details/21482687
這道題之前覺得4 4 這種輸入也沒啥用,結果開始編程直接沒編進去,打算結束的時候往里加,結果忘了,由此帶來的退出循環問題耗時耗力影響了解題進度。下次首先1.把輸入的格式先寫好2.盡量看清能給的條件,團結一切可以團結的力量。
莫名其妙flag每次結尾置0導致報錯
cin換成scanf提高正確率
以上兩點都是編譯器自己sb
對map的循環不能放在循環里,會超時,這個值得注意
下面放出我期待已久的map以及迭代器的用法,真的是太方便了,鳥槍換炮感覺就是不一樣!!開森(/≧▽≦)/
map<string,int> word_count; map<string,int>::iterator iter; //輸入字符串進mapfor(int i=0;i<a1;i++){cin>>word;++word_count[word];} //對map進行遍歷,并對數值進行操作for(iter = word_count.begin(); iter != word_count.end(); iter++){res+=(iter->second-1);iter->second=1;}這道題在思路上有一個改進點:
核心本題是求,字符重復的次數,我一直覺得得把map中的次數統計部分,數數,開始還為此發愁,后來直接遍歷的時候每個減1,就是重復次數了
但,其實還有更好方法。用
if(flag==1){cin>>word; //if括號里面的內容,運用了map的屬性,如果這個詞之前沒有出現過,查無此人,則一定會 //是false,這種情況就說明出現了重復,用一個單獨的變量統計重復的次數,只在這個時候 //++即可減輕了計算負擔if(word_count[word]) res++;else word_count[word]=1;flag=0;}下面放出我的解法:
#include<iostream> #include<math.h> #include<map> #include <string> #include<stdio.h> #include <cstdlib> using namespace std; int main() {map<string,int> word_count;map<string,int>::iterator iter;string word;int flag=-1;int res=0;int a1,a2;//scanf("%d %d",&a1,&a2);cin>>a1>>a2;for(int i=0;i<a1;i++){cin>>word;++word_count[word];}for(iter = word_count.begin(); iter != word_count.end(); iter++){res+=(iter->second-1);iter->second=1;}for(int i=0;i<a2;i++){//cout<<"flag:"<<flag<<endl;scanf("%d",&flag);//cout<<"flag1:"<<flag<<endl;//cin>>flag;if(flag==1){cin>>word;if(word_count[word]) res++;else word_count[word]=1;}else{cout<<res<<endl;res=0;}}return 0; }真正大佬的代碼,看看什么叫信達雅
//膜大佬 #include<bits/stdc++.h> using namespace std; int n,q,res; map<string,int> mp; int main() {scanf("%d %d",&n,&q);while(n--){string str;cin>>str;if(mp[str]) res++;else mp[str]=1;}while(q--){int op;scanf("%d",&op);if(op==1){string str;cin>>str;if(mp[str]) res++;else mp[str]=1;}else{printf("%d\n",res);res=0;}}return 0; }?2.pow慎用
尤其是先開完方再平方就容易有問題
int main() {int n=100; //如果是double的,結果還可以是100,如果是int型,結果是99,估計是精度造成的,但下 //次注意不要用pow,比較好的解決方式是直接乘,t*t,反正只用乘一次,但穩定性和正確 //率都會高很多double t=sqrt(n);cout<<t<<endl;double k=pow(t,2);cout<<k<<endl;return 0; }3.
特別注意一個思想上的問題
有些需要循環統計次數的問題,如果有一個全局變量計數,每次循環之前記得要清0
求公因子這次至少有兩道題,直接遍歷的方法很容易超時,這里介紹一種輾轉相除法
例1 。求兩個正數8251和6105的最大公因數。
(分析:輾轉相除→余數為零→得到結果)
解:8251=6105×1+2146
顯然8251與6105的最大公因數也必是2146的因數,同樣6105與2146的公因數也必是8251的因數,所以8251與6105的最大公因數也是6105與2146的最大公因數。
6105=2146×2+1813
2146=1813×1+333
1813=333×5+148
333=148×2+37
148=37×4+0
則37為8251與6105的最大公因數。
以上我們求最大公因數的方法就是輾轉相除法。也叫歐幾里德算法,它是由歐幾里德在公元前300年左右首先提出的。
?
轉載于:https://www.cnblogs.com/Marigolci/p/11026050.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的牛客小白赛190615场的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 搞笑视频分析---2、爱做饭的芋头:手搓
- 下一篇: Ubuntu16.04 python2.
