Nothing for Nothing( 十二 )

本文深入解析了四道编程挑战题目,包括字典操作、路径寻找、盒子管理和硬币排序,涵盖了数据结构、算法和搜索策略等核心编程概念。

题目1:Mahmoud and a Dictionary

代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5+10;
int f[maxn];
int Find(int x)
{
    if(f[x]==x)
        return x;
    else return f[x]=Find(f[x]);
}
char  a[100], b[100];
map<string, int>mp;
int main()
{
    int n, m, q;
    int f1, f2, f3, f4;
    scanf("%d %d %d", &n, &m, &q);
    for(int i = 1; i <= 2*n; i++)
    {
        f[i] = i;
    }
    for(int i = 1; i <= n; i++)
    {
        scanf("%s", a);
        mp[a] = i;
    }
    for(int i = 1; i <= m; i++)
    {
        int op;
        scanf("%d %s %s", &op, a, b);
        int x = mp[a];
        int y = mp[b];
        if(op == 1)
        {
            f1 = Find(n+x);
            f2 = Find(y);
            f3 = Find(x);
            f4 = Find(n+y);
            if(f1 == f2 || f3 == f4)
            {
                printf("NO\n");
            }
            else
            {
                    f[f2] = f3;
                    f[f1] = f4;
                printf("YES\n");
            }
        }
        else
        {
            f1 = Find(n+x);
            f2 = Find(y);
            f3 = Find(x);
            f4 = Find(n+y);
            if(f1 == f4 || f2 == f3)
            {
                printf("NO\n");

            }
            else
            {
                f[f1] = f2;
                f[f3] = f4;
                printf("YES\n");
            }
        }
    }
    for(int i = 1; i <= q; i++)
    {
        scanf("%s %s", a, b);
        int x = mp[a];
        int y = mp[b];
        f1 = Find(n+x);
        f2 = Find(y);
        f3 = Find(x);
        f4 = Find(n+y);
        //cout<<f1<<" "<<f2<<" "<<f3<<" "<<f4<<endl;
        if(f1 == f4 || f2 == f3)printf("1\n");
        else if(f1 == f2 || f3 == f4){
            printf("2\n");
        }
        else printf("3\n");

    }

}

题目2:Igor and his way to work

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int vis[maxn][maxn][5];
char mp[maxn][maxn];
int dx[maxn] = {1, -1, 0, 0};
int dy[maxn] = {0, 0, 1, -1};

int n, m;
int flag  = 0;
void dfs(int x, int y, int dir, int cnt){
     if(x <= 0 || x > n || y <= 0 || y > m || cnt > 2)return;
     if(vis[x][y][dir] <= cnt)return;
     if(mp[x][y] == 'T'){
        flag = 1;
        return;
     }
     if(mp[x][y] != '.' && mp[x][y] != 'S')return;
     vis[x][y][dir] = cnt;
     for(int i = 0; i < 4; i++){
        int xx, yy;
        xx = x+dx[i];
        yy = y+dy[i];
        if(dir == -1){
            dfs(xx, yy, i, cnt);
        }
        else if(dir != i){
            dfs(xx, yy, i, cnt+1);
        }
        else dfs(xx, yy, i, cnt);
     }
}
int main(){
    scanf("%d %d", &n, &m);
    int sx, sy;
    getchar();
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            scanf("%c", &mp[i][j]);
            if(mp[i][j] == 'S')sx = i, sy = j;
        }
        getchar();
    }
    flag = 0;
    memset(vis, 0x3f, sizeof vis);
    dfs(sx, sy, -1, 0);
    if(flag)printf("YES\n");
    else printf("NO\n");

return 0;
}

题目3:Okabe and Boxes

代码:

#include<bits/stdc++.h>
using namespace std;
char a[100];
vector<int>v;
int main(){
    int n;
    scanf("%d", &n);
    int cn = 1, ans = 0, t;
    for(int i = 1; i <= n*2; i++){
        getchar();
        scanf("%s", &a);
        if(a[0] == 'a')scanf("%d", &t),v.push_back(t);
        else {
            if(!v.empty() && v.back() != cn){
                ans++;
                v.clear();
            }
            else if(!v.empty())v.pop_back();
            cn++;
        }
    }
    printf("%d\n", ans);
return 0;
}

题目4:Sorting the Coins

代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 3e5+10;

#define Temp template<typename T>
int n, t;
int a[maxn<<2], st[maxn<<2];
Temp inline void read(T &x)
{
    x = 0;
    T w = 1, ch = getchar();
    while(!isdigit(ch) && ch!= '-')ch = getchar();
    if(ch == '-')w = -1, ch = getchar();
    while(isdigit(ch))x = (x<<3)+(x<<1)+(ch^'0'),ch = getchar();
    x = x * w;
}

void build(int o, int l, int r)
{
    if(l == r)st[o] = 0;
    else
    {
        int m = l + ((r-l)>>1);
        build(o<<1, l, m);
        build(o<<1|1, m+1, r);
        st[o] = st[o<<1] + st[o<<1|1];
    }
}
void update(int o,int l,int r,int ind,int ans)
{
    if(l==r)
    {
        st[o] = ans;
        return;
    }
    int m=l+((r-l)>>1);
    if(ind<=m)
    {
        update(o<<1,l,m,ind,ans);
    }
    else
    {
        update((o<<1)|1,m+1,r,ind,ans);
    }
    st[o]=st[o<<1]+st[(o<<1)|1];
}

int query(int o, int l, int r, int ql, int qr)
{
    if(ql<= l && qr >= r)return st[o];
    int m = l + ((r-l)>>1);
    int ans = 0;
    if(ql <= m)ans += query(o<<1, l, m, ql, qr);
    if(qr >= m+1)ans += query(o<<1|1, m+1, r, ql, qr);
    return ans;
}
int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = 1 + l + r >> 1;
        //cout<<query(1,1, n, n-mid+1, n)<<endl;
        if (query(1,1, n, n-mid+1, n) == mid)
        {
            l = mid;
            //cout<<r<<" jj"<<mid<<endl;
        }
        else r = mid -1;
    }
    return l;
}
int vis[maxn];
int main()
{

    read(n);
    build(1, 1, n);
    vis[0] = 1;
    for(int i = 1; i <= n; i++)
    {
        read(t);
        update(1, 1, n, t, 1);
        if(query(1, 1, n, n, n) == 0)
        {
            vis[i] = i+1;
            continue;
        }
        int k = bsearch_1(1, n);
        vis[i] = i - k+1;
    }
    for(int i = 0; i <= n; i++)
    {
        if(i != 0)printf(" ");
        printf("%d", vis[i]);
    }
    printf("\n");

    return 0;
}

### 关于 'Nothing to be done for' 的含义 在编程和构建系统中,“Nothing to be done for”通常是由工具(如 `Make` 或类似的构建工具)发出的消息。它表示目标文件已经是最新状态,无需重新编译或执行任何操作[^3]。 当构建系统运行时,它会比较源文件的时间戳与目标文件的时间戳。如果目标文件已经存在,并且其时间戳比所有依赖项更新,则不会触发任何进一步的操作。这种行为是为了优化构建过程,避免不必要的重复工作[^4]。 以下是可能的原因及其解释: 1. **目标已是最新的** 如果构建系统的配置文件(例如 Makefile 中的目标定义)表明当前目标不需要更改,因为它的依赖项未发生变化,那么会出现此消息。这意味着所有的依赖都已经被处理完毕,或者根本没有变化需要处理[^5]。 2. **无有效规则匹配** 另一种可能性是,在某些情况下,指定的目标没有任何适用的规则来完成所需的任务。这可能是由于错误的路径、名称拼写错误或其他配置问题引起的[^6]。 #### 解决方法 为了排查并解决问题,可以采取以下措施: - **检查依赖关系**:确认 Makefile 或其他构建脚本中的依赖关系是否正确设置。确保所有必要的输入文件都被正确定义为依赖项。 - **强制重建**:通过删除旧的目标文件或将它们标记为过期,强迫系统重新生成这些文件。例如,在 GNU Make 中可以使用 `-B` 参数强制全部重做[^7]。 - **调试模式启用**:许多现代构建工具有内置的日志功能可以帮助诊断为什么某个特定任务被认为已完成而跳过了实际的工作流。尝试开启更详细的日志记录选项以便更好地理解内部逻辑流程[^8]。 ```makefile # Example of forcing rebuild with GNU make $ make -B target_name ``` 上述命令将忽略现有的时间戳差异,从而强制重新创建指定的目标。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值