1.除法(Division, UVa 725)
#include <cstdio> #include <cstring> bool isOk(int a, int b){ char buff[20]; int visited[15]; memset(visited, 0, sizeof(visited)); sprintf(buff, "%05d%05d", a, b); for (int i =0; i < 10; i++){ int temp = buff[i] - '0'; if (0 == visited[temp]){ visited[temp]++; } else { return false; } } return true; } int main(void){ int N, cnt = 0; bool flag = false; for (;scanf("%d", &N) && N;){ if (cnt > 0){ printf(" "); } cnt++; flag = false; for (int i = 1234; i< 100000; i++){ if (0 == i%N){ int ans = i/N; if (isOk(i, ans)){ printf("%05d / %05d = %d ", i, ans, N); flag = true; } } } if (!flag){ printf("There are no solutions for %d. ",N); } } return 0; }
PE了,真是神奇,,C++处理字符串还是不够熟练。这种简单题目不能一次过就说明还是太水啊!!
2.最大乘积(Maximum Product, UVa 11059)
1 #include <cstdio> 2 #include <cstring> 3 #define ll long long 4 int a[20], n, cnt; 5 int main(void){ 6 for (cnt = 1;~scanf("%d", &n);cnt++){ 7 for (int i = 1; i <= n; i++){ 8 scanf("%d", &a[i]); 9 } 10 ll S = 1, maxn = 0; 11 for (int i = 1; i <= n; i++){ 12 S = 1;//忘记 13 for (int j = i; j <= n; j++){ 14 S *= a[j]; 15 if (S > maxn){ 16 maxn = S; 17 } 18 } 19 } 20 if (maxn < 0){ 21 maxn = 0; 22 } 23 printf("Case #%d: The maximum product is %lld. ", cnt, maxn); 24 getchar(); 25 } 26 return 0; 27 }
WA,因为逻辑没理清,忘这忘那!!
3.素数环(Prime Ring Problem, UVa 524)
1 #include "cstdio" 2 #include "cstring" 3 #include "cmath" 4 int n,vis[20], A[20]; 5 bool isPrime[50]; 6 7 void dfs(int cur){ 8 if (cur==n && isPrime[A[0]+A[n-1]]) { 9 for (int i=0; i < n-1; i++) printf("%d ", A[i]); 10 printf("%d ", A[n-1]); 11 } else { 12 for (int i = 2; i <= n; i++) { 13 if (!vis[i] && isPrime[i+A[cur-1]]) { 14 A[cur] = i; 15 vis[i] = 1; 16 dfs(cur+1); 17 vis[i] = 0; 18 } 19 } 20 } 21 } 22 void check(){ 23 for (int i = 2; i < 50; i++){ 24 isPrime[i] = true; 25 for (int k = 2; k < sqrt(i)+1; k++){ 26 if (i%k == 0){ 27 isPrime[i] = false; 28 break; 29 } 30 } 31 } 32 } 33 int main(int argc, char const *argv[]) 34 { 35 int t = 0; 36 check(); 37 for (;~scanf("%d", &n);){ 38 memset(vis, 0, sizeof(vis)); 39 A[0] = 1; 40 if (t > 0){printf(" ");} 41 printf("Case %d: ", ++t); 42 dfs(1); 43 } 44 return 0; 45 }
这一题PE两次,空行输出真是个大坑。
4.困难的串(Krypton Factor, UVa 129)
1 #include <cstdio> 2 #include <cstring> 3 #include <string> 4 5 int n,L, cnt; 6 char v[81]; 7 8 bool judge(int cur) 9 { 10 for(int i=1;i<=(cur+1)/2;i++)//判断长度为2*i的后缀是否有相同的 11 { 12 bool equal=1; 13 for(int j=0;j<i;j++) 14 if(v[cur-i-j]!=v[cur-j]) 15 { 16 equal=0; 17 break; 18 } 19 if(equal) 20 return false; 21 } 22 return true; 23 } 24 25 int dfs(int cur) 26 { 27 for(int i=0;i<L;i++) 28 { 29 v[cur]='A'+i; 30 if(judge(cur)) 31 { 32 cnt++; 33 if(cnt==n) 34 { 35 //attention format 36 for (int i=0; i<=cur; i++){ 37 printf("%c", v[i]); 38 if ((i+1)%4 == 0 && i!=cur) { 39 printf(" "); 40 } 41 if (i!=cur && (i+1)%64==0){ 42 printf(" "); 43 } 44 } 45 printf(" %d", cur+1); 46 return 1; 47 } 48 if(dfs(cur+1)) 49 return 1; 50 } 51 } 52 return 0; 53 } 54 55 int main() 56 { 57 for(;scanf("%d%d", &n, &L);) { 58 cnt=0; 59 dfs(0); 60 } 61 return 0; 62 }
超时!
1 #include "cstdio" 2 int n, L, cnt; 3 int S[100]; 4 int dfs(int cur){ 5 if(cnt++ == n){ 6 for(int i = 0; i < cur; i++) { 7 printf("%c", 'A'+S[i]); 8 if ((i+1)!=cur && (i+1)%4 ==0 && (i+1)!=64){printf(" ");} 9 if ((i+1)!=cur && (i+1)%64 == 0){printf(" ");} 10 } 11 printf(" %d ", cur); 12 return 0; 13 } 14 for(int i = 0; i < L; i++){ 15 S[cur] = i; 16 int ok = 1; 17 for(int j = 1; j*2 <= cur+1; j++){ 18 int equal = 1; 19 for(int k = 0; k < j; k++) 20 if(S[cur-k] != S[cur-k-j]) { equal = 0; break; } 21 if(equal) { ok = 0; break; } 22 } 23 if(ok) if(!dfs(cur+1)) return 0; 24 } 25 return 1; 26 } 27 int main(int argc, char const *argv[]) 28 { 29 for (;scanf("%d%d", &n, &L) && n;){ 30 cnt = 0; 31 dfs(0); 32 } 33 return 0; 34 }
PE三次,更可怕的是思路也被完全碾压,回溯!!