hdu 4731 Minimum palindrome(暴力打表找規律)
阿新 • • 發佈:2018-12-24
題目:http://acm.hdu.edu.cn/showproblem.php?pid=4731
題目大意:用字母表的前m個字母(有的可以不用)構造一個長度為n的字串,要求這個字串的最長迴文串的長度最小。
思路:如果m ==1 ,那麼就肯定全是a,如果m >= 3,可以證明肯定是 abc 這樣迴圈,關鍵在於m == 2這裡,也就是隻有ab的時候。然後就是打表了,打前 20 個,很容易可以發現規律,有個迴圈節,然後最後再處理一下就好了,前幾個特判。
這道題目真的囧了,下午比賽全卡在這題上了,沒去想暴力打表找規律,然後一直在那邊YY,唉,不說了,說多了都是淚啊。。 T^T 記住,以後找規律,先暴力打表,不要手算去!
程式碼如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; /* a ab aab aabb aaaba aaabab aaababb aaababbb aaaababba aaaababbaa aaaababbaaa aaaababbaaaa aaaababbaabab aaaababbaababb aaaababbaababba aaaababbaababbaa aaaababbaababbaaa aaaababbaababbaaaa aaaababbaababbaabab */ int main() { int T; scanf("%d",&T); for(int cas = 1;cas<=T;cas ++) { int m,n; scanf("%d%d",&m,&n); printf("Case #%d: ",cas); if(m == 1) { for(int i = 0;i<n;i++) printf("a"); puts(""); } else if(m == 2) { if(n == 1) { puts("a"); } else if(n ==2) { puts("ab"); } else if(n == 3) { puts("aab"); } else if(n == 4) { puts("aabb"); } else if(n ==5) { puts("aaaba"); } else if(n == 6) { puts("aaabab"); } else if(n ==7) { puts("aaababb"); } else if(n == 8) { puts("aaababbb"); } else { printf("aa"); int num = (n - 2)/6; for(int i = 1;i<=num;i++) { printf("aababb"); } int ed = num*6 +2; if(ed <= n - 1 || ed >= n - 4) { for(int i = ed +1 ;i<=n;i++) printf("a"); } else if(ed == n - 5) { printf("aabab"); } puts(""); } } else { for(int i = 0;i<n;i++) { if(i%3 == 0) printf("a"); else if(i%3 ==1) printf("b"); else printf("c"); } puts(""); } } return 0; }