Bestcoder R69 div2
题目链接:
HDU 5161-5163
Standing: 12/1058
A:
简单暴力枚举
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int T;
scanf("%d", &T);
while(T--){
int a, b, n;
scanf("%d%d%d", &a, &b, &n);
int ans = -1;
int out1, out2;
int t1 = n / a;
int t2 = 0;
while(t1 >= 0){
t2 = (n - a * t1) / b;
if(t1 * a + t2 * b == n && t1 % 2 == 0 && t2 % 2 == 0){
if(ans == -1 || ans > t1 + t2) ans = t1 + t2, out1 = t1, out2 = t2;
}
t1--;
}
if(ans == -1) printf("Impossible\n");
else printf("%d %d\n", out1, out2);
}
return 0;
}
B:
简单判断,由于姿势不够优美调了一段时间
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int toI(char c){return c - '0';}
bool valid(char data[15])
{
int ok = 1;
for(int i = 7 ; i <= 10 ; i++){
if(data[i] != data[i - 1]){
ok = 0;
break;
}
}
if(ok) return true;
// printf("first\n");
ok = 1;
int f = 1;
int d;
for(int i = 7 ; i <= 10 ; i++){
if(abs(data[i] - data[i - 1]) == 1){
if(f) f = 0, d = data[i] - data[i - 1];
else{
if(data[i] - data[i - 1] != d){
ok = 0;
break;
}
}
}
else{
ok = 0;
break;
}
}
if(ok) return true;
// printf("second\n");
int year = toI(data[3]) * 1000 + toI(data[4]) * 100 + toI(data[5]) * 10 + toI(data[6]);
int month = toI(data[7]) * 10 + toI(data[8]);
int day = toI(data[9]) * 10 + toI(data[10]);
if(year < 1980 || year > 2016) return false;
int up = 0;
switch(month){
case 1: up = 31; break;
case 2: up = 28; break;
case 3: up = 31; break;
case 4: up = 30; break;
case 5: up = 31; break;
case 6: up = 30; break;
case 7: up = 31; break;
case 8: up = 31; break;
case 9: up = 30; break;
case 10: up = 31; break;
case 11: up = 30; break;
case 12: up = 31; break;
}
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
if(month == 2) up = 29;
}
if(day >= 1 && day <= up) return true;
return false;
}
char data[15];
int main()
{
int T;
scanf("%d", &T);
while(T--){
long long a, b;
long long ans = 0;
int n;
cin >> n >> a >> b;
while(n--){
scanf("%s", data);
// printf("valid(data) = %d\n", valid(data));
if(valid(data)) ans += a;
else ans += b;
}
cout << ans << endl;
}
return 0;
}```
C:
打死都想不到暴搜……
因为最多15个数字,对于每个存有数字的点可以上下左右四个方向走,所以表达式的个数有限(其实具体怎么算的14000*4我也不知道),然后用那种最简单的回溯来枚举所有情况就可以。
using namespace std;
const int MAXN = 30 + 5;
char op[MAXN][MAXN];
int vis[MAXN][MAXN];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};
int n, m, ok;
LL lv;
int toI(char c){return c - ‘0’;}
bool valid(int x, int y){if(x >= 1 && x <= n && y >= 1 && y <= m) return true; else return false;}
struct Frac
{
LL u, v;
Frac(){}
Frac(LL _u, LL _v){u = _u, v = _v;}
Frac operator * (const Frac &rbs)const {return Frac(u * rbs.u, v * rbs.v);}
Frac operator / (const Frac &rbs)const {return Frac(u * rbs.v, v * rbs.u);}
Frac operator + (const Frac &rbs)const {return Frac(u * rbs.v + v * rbs.u, v * rbs.v);}
Frac operator - (const Frac &rbs)const {return Frac(u * rbs.v - v * rbs.u, v * rbs.v);}
};
void dfs(int x, int y, Frac f)
{
// printf(“x = %d, y = %d, f.u = %I64d, f.v = %I64d\n”, x, y, f.u, f.v);
// system(“pause”);
if(f.u % f.v == 0 && f.u / f.v == lv) ok = 1;
vis[x][y] = 1;
for(int i = 0 ; i < 4 ; i++){
if(ok) return;
int u1 = x + dx[i]; int v1 = y + dy[i];
int u2 = u1 + dx[i]; int v2 = v1 + dy[i];
// printf(“x = %d, y = %d, u1 = %d, v1 = %d, u2 = %d, v2 = %d\n”, x, y, u1, v1, u2, v2);
if(valid(u2, v2) && vis[u2][v2] == 0){
Frac temp = Frac(toI(op[u2][v2]), 1);
// switch(op[u1][v1]){
// case ‘+’: dfs(u2, v2, f + temp); break;
// case ‘-‘: dfs(u2, v2, f - temp); break;
// case ‘‘: dfs(u2, v2, f temp); break;
// case ‘/’: if(temp.u != 0) dfs(u2, v2, f / temp); break;
if(op[u1][v1] == ‘+’) dfs(u2, v2, f + temp);
if(op[u1][v1] == ‘-‘) dfs(u2, v2, f - temp);
if(op[u1][v1] == ‘‘) dfs(u2, v2, f temp);
if(op[u1][v1] == ‘/’ && temp.u) dfs(u2, v2, f / temp);
}
}
vis[x][y] = 0;
}
int main()
{
int T;
scanf(“%d”, &T);
while(T–){
memset(vis, 0, sizeof(vis));
ok = 0;
scanf(“%d%d%I64d”, &n, &m, &lv);
for(int i = 1 ; i <= n ; i++) scanf(“%s”, op[i] + 1);
for(int i = 1 ; i <= n ; i += 2){
for(int j = 1 ; j <= m ; j += 2){
dfs(i, j, Frac(toI(op[i][j]), 1));
// printf(“\n”);
}
}
if(ok) printf(“Possible\n”);
else printf(“Impossible\n”);
}
return 0;
}
“`
D:
http://blog.csdn.net/beihai2013/article/details/50572906