acm之旅--推免机试摸底

文章目录

          • A - 简单密码
          • D - Arbitrage
          • E - A Bug's Life

题目链接: 推免机试摸底
我好菜啊,规定时间内就做出了一道,后来看了看明明实力可以做出三道。

A - 简单密码

题目链接:A - 简单密码

  • 思路:水题。

代码:

#include 
#include 
#include 
using namespace std;

string A = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string B = "VWXYZABCDEFGHIJKLMNOPQRSTU";

int main()
{
    string C, D = "";
    getline(cin, C);
    for(int i=0; i<C.size(); i++)
    {
        if(isupper(C[i]))
        {
            int idx;
            for(idx=0; idx<A.size(); idx++)
            {
                if(A[idx]==C[i]) break;
            }
            D += B[idx];
        }
        else
        {
            D += C[i];
        }
    }
    cout << D << endl;
}
D - Arbitrage

题目链接:D - Arbitrage

  • 思路:floyd算法的变体。dp[i][j]表示i到j的汇率。

代码:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

double dp[50][50];
int n, m;
map<string, int> ID;

void Init()
{
    ID.clear();
    memset(dp, 0, sizeof(dp));
}
void floyd()
{
    for(int k=0; k<n; k++)
    {
        for(int i=0; i<n; i++)
        {
            if(dp[i][k]==0) continue;
            for(int j=0; j<n; j++)
            {
                if(dp[k][j]==0) continue;
                dp[i][j] = max(dp[i][j], dp[i][k]*dp[k][j]);
            }
        }
    }
}
int main()
{
    int kase = 1;
    double cost;
    string name1, name2;
    while(cin >> n && n)
    {
        Init();
        for(int i=0; i<n; i++)
        {
            cin >> name1;
            ID[name1] = i;
            dp[i][i] = 1.0;
        }
        cin >> m;
        for(int i=0; i<m; i++)
        {
            cin >> name1 >> cost >> name2;
            dp[ID[name1]][ID[name2]] = cost;
        }
        floyd();
        int flag = 0;
        for(int i=0; i<n; i++)
        {
            if(dp[i][i]>1)
            {
                flag = 1;
                break;
            }
        }
        cout << "Case " << kase++ << ": ";
        if(flag) cout << "Yes" << endl;
        else     cout << "No" << endl;
    }
    return 0;
}
E - A Bug’s Life

题目链接:E - A Bug’s Life

  • 思路:简单并查集,类似动物园。

代码:

#include 
#include 
#include 
using namespace std;

int father[10000], Rank[10000];
void Init(int n)
{
    for(int i=0; i<=2*n; i++)
    {
        father[i] = i;
        Rank[i] = 1;
    }
}
int findRoot(int x)
{
    int r = x;
    while(r!=father[r]) r = father[r];
    int j = x, i;
    while(j!=father[j])
    {
        i = father[j];
        father[j] = r;
        j = i;
    }
    return r;
}
void join(int x, int y)
{
    int fx = findRoot(x), fy = findRoot(y);
    if(fx!=fy)
    {
        if(Rank[fx]>Rank[fy]) father[fy] = fx;
        else
        {
            father[fx] = fy;
            if(Rank[fx]==Rank[fy]) Rank[fy]++;
        }
    }
}
bool same(int x, int y)
{
    return findRoot(x)==findRoot(y);
}

int main()
{
    int T, a, b, n, m, kase = 1;
    cin >> T;
    while(T--)
    {
        cin >> n >> m;
        int flag = 0;
        Init(2*n);
        while(m--)
        {
            cin >> a >> b;
            if(flag) continue;
            if(same(a, b))
                flag = 1;
            else
            {
                join(a+n, b);
                join(a, b+n);
            }
        }
        printf("Scenario #%d:\n", kase++);
        if(flag) printf("Suspicious bugs found!\n\n");
        else     printf("No suspicious bugs found!\n\n");
    }
    return 0;
}

你可能感兴趣的:(ACM刷题之路)