zerojudge d068. 該減肥了 Get link Facebook X Pinterest Email Other Apps August 21, 2020 zerojudge d068. 該減肥了解法大全:1.判斷式2.三元運算子3.布林比較: w=w-(w>50); //same as w-=(w>50) //not w=w-w>50; //"-" has higher priority to">" , this will always get 0 //more complex w=(w<=50)*w+(w>50)*(w-1); Get link Facebook X Pinterest Email Other Apps Comments
zerojudge c561. Bert 愛搗蛋 August 20, 2020 zerojudge c561. Bert 愛搗蛋 解法大全: 思路的大方向: 1.先選答案,再翻轉 優點:省時間(只要翻轉一次) 缺點:較不直覺,較難寫 答案要先比位數,再比末位數大小 先取位數較多的,再取末位數大的 其方法有: a.排序: 用內建sort搭配自寫的cmp函式 sort語法: sort(s,s+n,cmp); 重要的是自寫cmp函式 自己寫的參考程式碼: typedef struct obj { int len; string s; char c; obj( string a){s=a,len=s.length(),c=s[len -1 ];} }OBJ; int cmp ( string s1, string s2) { OBJ obja (s1) , objb (s2) ; if (obja.len==objb.len) { if (obja.c==objb.c) return 0 ; else if (obja.c<objb.c) return 1 ; else return -1 ; } return obja.len-objb.len; } 註:在自訂測資中答案是正確的,但在正式測資時會出現NA(有時是SEGERROR,有時是答案錯誤) b.直接選: /* DATE:2020/08/20 zerojudge c561 Version:3 status:not complete yet */ #include <iostream> using namespace std; #include <string> #define RE_C 1 int cas=0,ti=1; void check() { #ifdef RE_C==1 cout<<cas<<"er"<<ti++<<endl; #endif } typedef struct obj { int len; int last_digit; int big; string s; obj(){big=1;} void setdigit(){len--;la... Read more
zerojudge d122. Oh! My Zero!! August 23, 2020 zerojudge d122. Oh! My Zero!! 千萬別用暴力解( 1a和2a的解法)!!,因為一定會TLE。 千萬別用2b!!,因為輸入很大(長整數),這樣字要用很大的記憶體,會出現錯誤(RE),我試過,真的。 解法大全: 1.依思路分: a)直接算階乘 b)算5法 2.建表 a)建階乘表 b)建5表 千萬別用暴力解( 1a和2a的解法)!!,因為一定會TLE。 千萬別用2b!!,因為輸入很大(長整數),這樣字要用很大的記憶體,會出現錯誤(RE),我試過,真的。 思路: 數學歸納法 1. 首先,你要先了解10=2*5,且2出現的次數比5多 所以要算出現比較少的次數(5的次數) 2. 再來你得先寫兩個表格 分別為, a)5的倍數數字的質因數中有多少的5(5的倍數數字可以整除幾次5) 用數學式表示:n=k*5^m (k,m為正整數) b)輸入和輸出的關係 3. 找規律 我的解法: 先用這方式寫 2b)先建表(1~1000000中能被5整除的次數),在逐項加起來 # define PO 7 const int MX= pow ( 10.0 ,PO);//because n is too large // MX=pow(10.0,5); typedef long long int LLI; int five_n[MX]={ 0 }; void print ( int *, int ) ; void build () { //memset(five_n,0,sizeof(five_n)); for ( int i= 1 ;i<=PO;i++) { int n= pow ( 5.0 ,i); for ( int j=n;j<=MX;j+=n) { five_n[j]++; } } return ; } int deal (LLI n) { int sum= 0 ; for ( int i= 5 ;i<=n;i+= 5 ) { sum+=five_n[i]; } return sum; } RE (SIGSEGV) 1b)算5法:就是輸入一個數字N,算N!可以被5除多少次... Read more
Comments
Post a Comment