日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

牛客小白赛190615场

發布時間:2025/6/17 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客小白赛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%?1n,Q5×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年左右首先提出的。

int gcd1(int a,int b) {int temp;if(a==0||b==0)return -1;if(a<b){ temp=a;a=b;b=temp;} //求最小值最大值,大的用a表示,小的用b表示while(b!=0) //用循環求最大公約數 {temp=a%b;a=b;b=temp;}if(a==1)return -1;return a; //返回最大公約數 }

?

轉載于:https://www.cnblogs.com/Marigolci/p/11026050.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的牛客小白赛190615场的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。