2 2 3 5 A 2 B 2 C 3 D 3 E 3 A 4 B 4 C 9 D 9 E 9 2 2 2 A 4 B 4 A 3 B 3 A 9 B 9
2 3 NO Hint: The first test case, $a=2, b=3$ can make equation right. The second test case, no any answer.
一开始处理的有问题,结构体不可行,后来看了大神的做法 用个函数 就给解决了。
我的AC代码:
#include<cstdio> #include<cstring> #include<cmath> #include<queue> #define mem(a, b) memset(a, (b), sizeof(a)) #define Wi(a) while(a--) #define Si(a) scanf("%d", &a) #define Pi(a) printf("%d\n", (a)) #define INF 0x3f3f3f3f #include<algorithm> using namespace std; int a[30], b[30], c[30]; bool find(int x, int y) { for(int k = 0; k < 26; k++) { if(x*a[k] + y*b[k] != c[k]) return 0; } return 1; } int main() { int t; Si(t); Wi(t) { mem(a, 0);mem(b, 0);mem(c, 0); char s[2]; int u, v, w; scanf("%d%d%d", &u, &v, &w); int i, j, k, d; for(i = 0; i < u; i++) { scanf("%s%d",s, &d); a[s[0]-'A'] += d; } for(i = 0; i < v; i++) { scanf("%s%d",s, &d); b[s[0]-'A'] += d; } for(i = 0; i < w; i++) { scanf("%s%d",s, &d); c[s[0]-'A'] += d; } bool flag = 0; for(i = 1; i <= 100; i++) { for(j = 1; j <= 100; j++) { if(find(i, j)) { printf("%d %d\n", i, j); flag = 1; break; } } if(flag) break; } if(!flag) puts("NO"); } return 0; }
AC代码:
#include<cstdio> #include<cstring> #include<cmath> #include<queue> #define mem(a, b) memset(a, (b), sizeof(a)) #define Wi(a) while(a--) #define Si(a) scanf("%d", &a) #define Pi(a) printf("%d\n", (a)) #define INF 0x3f3f3f3f #include<algorithm> using namespace std; int a[3][30]; int b[3]; bool judge(int x, int y) { for(int i = 0; i <= 25; i++) { if(a[0][i]*x+a[1][i]*y != a[2][i]) return false; } return true; } int main() { int t; Si(t); Wi(t) { mem(a, 0); char s[2]; int i, j, k, d; for(i = 0; i < 3; i++) Si(b[i]); for(i = 0; i < 3; i++) { for(j = 1; j <= b[i]; j++ ) { scanf("%s%d", s, &d); a[i][s[0]-'A'] = d; } } bool flag = false; for(i = 1; i <= 100; i++) { for(j = 1; j <= 100; j++) { if(judge(i, j)) { printf("%d %d\n", i, j); flag = 1;break; } } if(flag) break; } if(!flag) printf("NO\n"); } return 0; }