21行代码AC——例题5-2 Ducci序列(Ducci Sequence,UVa1594)——解题报告
勵(lì)志用少的代碼做高效的表達(dá)。
題目(提交)鏈接→UVa-1594
本題為水題,因此側(cè)重點(diǎn)從解題轉(zhuǎn)變?yōu)閮?yōu)化。
注意點(diǎn):
1、下一輪是按照上一輪的每個(gè)數(shù)做運(yùn)算,但下一輪每次運(yùn)算都會(huì)改變數(shù)列的值,造成運(yùn)算不準(zhǔn)確,我的做法是:事先拷貝一個(gè)數(shù)列b,用數(shù)列b的值做運(yùn)算,而后賦值給a。
2、我判斷0序列的方法是:用#include<algorithm>中的count()函數(shù),如果0的數(shù)量等于數(shù)組長(zhǎng)度,則輸出zero。循環(huán)直接結(jié)束。這樣可以避免出現(xiàn)全為0仍然繼續(xù)運(yùn)算的情況。提高效率。
代碼1:
#include<bits/stdc++.h> using namespace std; int main() {int n; cin >> n; while(n--) { //n是序列個(gè)數(shù) int m; cin >> m; //m是序列中元素?cái)?shù) int a[m+1], b[m+1]; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); //a[m]存儲(chǔ)元素,b[m]做拷貝 ,從1開始好循環(huán) for(int i = 1; i <= m; i++) { cin >> a[i] ; b[i] = a[i]; } //輸入a序列,拷貝b序列int num = 0;while(num++ < 1000) { //滿1000次退出循環(huán) for(int i = 1; i <= m; i++) a[i] = abs(b[i]-b[(i+m)%m+1]); //取余。求絕對(duì)值 memcpy(b,a,sizeof(a)); //賦值 if(count(a+1,a+m+1,0) == m) { //如果0在a中的個(gè)數(shù)=m,則說(shuō)明全部置0。 cout << "ZERO" << endl;break;}}if(num == 1001) cout << "LOOP" <<endl; //若遍歷滿1000次,說(shuō)明是循環(huán)。 }return 0; }二刷:
初沒有看全題目,還在想怎么判斷循環(huán)節(jié),結(jié)果發(fā)現(xiàn)在Input里最后一句給了限制:循環(huán)次數(shù)不超過一k。 厘清思路后AC
由于數(shù)組的值是單獨(dú)存在的,那么判斷更新后的數(shù)組是否與之前的重復(fù),或它是全零數(shù)組時(shí),按照正常的方法,就需要for循環(huán)判斷,非常麻煩,也容易出錯(cuò)。
經(jīng)過腦暴后, 想到用set<vector>來(lái)處理, 同時(shí)定義一個(gè)全零vector數(shù)組,如果set添加新值后size()不變,則代表出現(xiàn)LOOP(set自動(dòng)去重), 如果新值等于全零數(shù)組(vector重載了+,==等運(yùn)算符,很方便),則代表ZERO。提高效率,避免遍歷一千次。
這次相對(duì)一刷有一個(gè)改進(jìn),在代碼二的14行用了一個(gè)特判,避免定義兩個(gè)數(shù)組互相賦值,整整降低了120MS的復(fù)雜度(汗!)
提交,AC。
看了看AC榜,竟然還有120MS過的,可惜他的代碼沒有share,看不到。希望大家以后在提交時(shí)都把代碼share,我們互相學(xué)習(xí)共同進(jìn)步。
代碼2:
#include<bits/stdc++.h> using namespace std; int main() {int T; cin >>T; while(T--) {int n; cin>> n; set<vector<int>>s;vector<int>temp;for(int i = 0; i < n; i++) {int x; cin>>x; temp.push_back(x);} //接下來(lái)是操作 vector<int>v(n, 0); //定義0數(shù)組 while(1) {int a = temp[0]; //更新數(shù)組,由于temp[0]更新,所以用特判 for(int i=0; i< (n-1); i++) temp[i] = (abs(temp[i]-temp[(i+1)%n]));temp[n-1] = abs(a-temp[n-1]);int len1 = s.size(); //判斷 s.insert(temp);if(len1+1 != s.size()) {cout << "LOOP" << endl; break;} else if(temp==v) {cout << "ZERO" << endl; break;}}}return 0; }日拱一卒,功不唐捐。
總結(jié)
以上是生活随笔為你收集整理的21行代码AC——例题5-2 Ducci序列(Ducci Sequence,UVa1594)——解题报告的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 21行代码AC——习题5-1 代码对齐(
- 下一篇: 17行代码AC——习题5-3 卡片游戏(