做了一天水题,挑几个还算凑合的发上来。
POJ1008 Maya Calendar
分析:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; char Haab[][10] = {"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol", "chen", "yax", "zac", "ceh", "mac", "kankin", "muan", "pax", "koyab", "cumhu", "uayet"}; char Tzo[][10] = {"imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik", "lamat", "muluk", "ok", "chuen", "eb", "ben", "ix", "mem", "cib", "caban", "eznab", "canac", "ahau"}; int main() { int year, day, cnt, month; char szmonth[20]; int T; scanf("%d", &T); printf("%d\n", T); for(int k=0; k<T; k++) { scanf("%d.%s%d", &day, szmonth, &year); for(int i=0; i<19; i++) if(strcmp(Haab[i], szmonth) == 0) month = i; cnt = year*365+month*20+day+1; int ty=0, td=0, tm=0; ty=(cnt-1+260)/260-1; tm=(cnt-1+20)%20; td=(cnt-1+13)%13+1; printf("%d %s %d\n", td, Tzo[tm], ty); } return 0; }
POJ1013 Counterfeit Dollar
分析:
超级暴力:分别对A~L这12个字母枚举轻重两种情况。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char _left[5][20], _right[5][20], cond[5][20]; int cmp(char s1[], char s2[], int k, int j) { /* * 用来比较天平的平衡 * 右边up 返回 1 * 平衡 返回 0 * 右边down 返回 -1 */ int len = strlen(s1); int lef, rig; lef = rig = 0; for(int i=0; i<len; i++) { if(s1[i] == 'A'+k) lef += j; if(s2[i] == 'A'+k) rig += j; } if(lef < rig) return 1; else if(lef == rig) return 0; else return -1; } int main(){ int T, i, c, j; scanf("%d", &T); while(T--) { for(i=0; i<3; i++) { scanf("%s %s %s", _left[i], _right[i], cond[i]); } for(i=0; i<12; i++) { //分别枚举12个字母 for(j=-1; j<=1; j++) { //轻重两种情况 if(j==0) continue; for(c=0; c<3; c++) { //三组 int res = cmp(_left[c], _right[c], i, j); if( ! ((res == 1 && cond[c][0] == 'u') || (res == 0 && cond[c][0] == 'e') || (res == -1 && cond[c][0] == 'd'))) break; } if(c >= 3) break; } if(c >= 3) break; } printf("%c is the counterfeit coin and it is ", i+'A'); if(j == -1) printf("heavy.\n"); else printf("light.\n"); } return 0; }
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int maxn = 100000+10; int hash[maxn]; int get(int n) { if(!hash[n]) { int t = n; int cnt = 0; while(true) { cnt++; if(n == 1) return (hash[t] = cnt); if(n % 2 == 1) n = 3*n+1; else n = n/2; } } else return hash[n]; } int main() { int a, b, n, m; memset(hash, 0, sizeof(hash)); while(scanf("%d %d", &n, &m) == 2) { a = n, b = m; if(a > b) swap(a, b); int max_v = -1; for(int i=a; i<=b; i++) { if(max_v < get(i)) { max_v = get(i); } } printf("%d %d %d\n", n, m, max_v); } return 0; }
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int maxn = 55; char s[maxn]; int main() { int n; scanf("%d", &n); while(n--) { scanf("%s", s); for(int i=0; i<4; i++) { int ans = 0; for(int j=0; j<8; j++) { ans += (s[i*8+j]-'0')*(1<<(7-j)); } if(i == 0) printf("%d", ans); else printf(".%d", ans); } putchar('\n'); } return 0; }
分析:
用减的话会超时的。用除省时间。
#include <iostream> #include <cstdio> using namespace std; int main(){ int n, a, b; int cnt1, cnt2; scanf("%d", &n); for(int kase=1; kase<=n; kase++) { cnt1 = cnt2 = 0; scanf("%d%d", &a, &b); while(a != b) { if(a > b) { cnt1 += a/b; a %= b; if(a == 0) { cnt1--; break; } } else { cnt2 += b/a; b %= a; if(b == 0) { cnt2--; break; } } } printf("Scenario #%d:\n", kase); printf("%d %d\n\n", cnt1, cnt2); } return 0; }