Bestcoder Round#69 div2

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我也不知道),然后用那种最简单的回溯来枚举所有情况就可以。

include

include

include

include

include

include

include

using namespace std;

define LL long long

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

你可能感兴趣的:(Bestcoder Round#69 div2)