一些关于信息学竞赛的疑问
  • 板块学术版
  • 楼主miaohongxuan
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/1/10 22:14
  • 上次更新2023/10/24 04:49:10
查看原帖
一些关于信息学竞赛的疑问
280679
miaohongxuan楼主2023/1/10 22:14
  1. 求助两道站外题
  • pSmDNp4.png
#include <bits/stdc++.h>
using namespace std;
int n,m,num;
int vis[10];
int maps[10];
int shengCheng[10][10];
int heat[10][10];
int ans;
void dfs(int now, int cnt){
    int flag = 1;
    for(int i = 0; i < num; i++){
        if(vis[i] == 0){
            vis[i] = 1;
            dfs(shengCheng[now][maps[i]],cnt+heat[now][maps[i]]);
            vis[i] = 0;
            flag = 0;
        }
    }
    if(flag == 1){
        ans = min(ans,cnt);
    }
}
int main(){
    cin >> n;
    while(n--){
        cin >> m;
        for(int i = 0; i < m; i++){
            for(int j = 0; j < m; j++){
                int a,b;
                cin >> a >> b;
                shengCheng[i][j] = a;
                heat[i][j] = b;
            }
        }
        memset(vis,0,sizeof(vis));
        ans = INT_MAX;
        cin >> num;
        for(int i = 0; i < num; i++){
            cin >> maps[i];
        }
        for(int i = 0; i < num; i++){
            vis[i] = 1;
            dfs(maps[i],0);
            vis[i] = 0;
        }
        cout << ans << endl;
        char x;
        cin >> x;
    }
    return 0;
}
  • pSmDNp4.png
#include <bits/stdc++.h>
using namespace std;
int n,m;
int dp[50][50][50][50];
int n1[50];
int n2[50];
int n3[50];
int n4[50];
int t1,t2,t3,t4;
int basket[105];
int tb;
int dfs(int m1,int m2,int m3,int m4){
    if(dp[m1][m2][m3][m4] != -1){
        return dp[m1][m2][m3][m4];
    }
    if(tb == 5){
        return dp[m1][m2][m3][m4] = 0;
    }
    if(t1 < n-1 && tb < 5){
        basket[n1[t1++]]++;
        tb++;
        if(basket[n1[t1-1]] >= 2){
            basket[n1[t1-1]] -= 2;
            tb -= 2;
            dp[m1][m2][m3][m4] = max(dfs(m1-1,m2,m3,m4)+1,dp[m1][m2][m3][m4]);
            basket[n1[t1-1]] ++;
            tb++;
            t1++;
        }else{
            dp[m1][m2][m3][m4] = max(dfs(m1-1,m2,m3,m4),dp[m1][m2][m3][m4]);
            basket[n1[t1-1]] --;
            tb--;
            t1++;
        }
    }if(t4 < n-1 && tb < 5){
        basket[n4[t4++]]++;
        tb++;
        if(basket[n4[t4-1]] >= 2){
            basket[n4[t4-1]] -= 2;
            tb -= 2;
            dp[m1][m2][m3][m4] = max(dfs(m1,m2,m3,m4-1)+1,dp[m1][m2][m3][m4]);
            basket[n4[t4-1]] ++;
            tb++;
            t4++;
        }else{
            dp[m1][m2][m3][m4] = max(dfs(m1,m2,m3,m4-1),dp[m1][m2][m3][m4]);
            basket[n4[t4-1]] --;
            tb--;
            t4++;
        }
    }if(t2 < n-1 && tb < 5){
        basket[n2[t2++]]++;
        tb++;
        if(basket[n2[t2-1]] >= 2){
            basket[n2[t2-1]] -= 2;
            tb -= 2;
            dp[m1][m2][m3][m4] = max(dfs(m1,m2-1,m3,m4)+1,dp[m1][m2][m3][m4]);
            basket[n2[t2-1]] ++;
            tb++;
            t2++;
        }else{
            dp[m1][m2][m3][m4] = max(dfs(m1,m2-1,m3,m4),dp[m1][m2][m3][m4]);
            basket[n2[t2-1]] --;
            tb--;
            t2++;
        }
    }if(t3 < n-1 && tb < 5){
        basket[n3[t3++]]++;
        tb++;
        if(basket[n3[t3-1]] >= 2){
            basket[n3[t3-1]] -= 2;
            tb -= 2;
            dp[m1][m2][m3][m4] = max(dfs(m1,m2,m3-1,m4)+1,dp[m1][m2][m3][m4]);
            basket[n3[t3-1]] ++;
            tb++;
            t3++;
        }else{
            dp[m1][m2][m3][m4] = max(dfs(m1,m2,m3-1,m4),dp[m1][m2][m3][m4]);
            basket[n3[t3-1]] --;
            tb--;
            t3++;
        }
    }
    if(dp[m1][m2][m3][m4] == -1){
        dp[m1][m2][m3][m4] = 0;
    }
    return dp[m1][m2][m3][m4];
}
int main(){
    while(1){
        cin >> n;
        if(n == 0){
            break;
        }
        for(int i = 0; i < n; i++){
            cin >> n1[i] >> n2[i] >> n3[i] >> n4[i];
        }
        t1 = t2 = t3 = t4 = 0;
        memset(dp,-1,sizeof(dp));
        memset(basket,0,sizeof(basket));
        tb = 0;
        cout << dfs(n,n,n,n) << endl;
    }
    return 0;
}
  1. 关于那些运算符,比如 ΣΣ 这种的都是什么意思,用法是什么。(LZ是某八年级学生,没有学过高中数学)希望能够推荐比较好的博客或文章。(不要是视频,作为上海某民办学校八年级学生,尤其是五大竞赛不能保送的情况下,中考和WHK的压力还是很大的,我希望各位大佬能够给出一个平衡文化课和信息学竞赛的方案。我知道这很难,也知道需要足够的时间和练习作为竞赛的基础。)

  2. 关于学什么、为什么不会题目的问题

就算法来看,似乎提高组也不过(可能是用词不当)是一些基础算法。那么对于TG1=实力都没有的我来说,是否有意义学习其他的算法(其实已经学了3年+近4年了,而且现在我是绿+不会,绿-写挂),在学习较难的算法的过程中,课上的时间其实很有限,有没有推荐的书籍,主要介绍算法本身的原理的那种(最好简单但是深刻,虽然这有些不切实际),除了做题如何巩固这些算法,如何高效背模板(当然是要背会的,但是我总是错),如果把模板灵活的用于题目,如何识别题目需要的算法?如何解决基础算法不行,拿到比较基础的题目甚至会没有思路,写的代码总是出错,还找不出bug的问题(前面两个代码应该可以很好地印证这一点)?(这段是和前面重复的:作为上海某民办学校八年级学生,尤其是五大竞赛不能保送的情况下,中考和WHK的压力还是很大的,我希望各位大佬能够给出一个平衡文化课和信息学竞赛的方案。我知道这很难,也知道需要足够的时间和练习作为竞赛的基础。)

  1. 关于前途?或者说关于我的水平大概如何?

我觉得我可以料到答案。其实我的练习实在太少了,尽管学了3年的C++,但是只做了100+的题目。主要是因为我基础问题比较多,很多题目都调不好,并且能够付出的时间也比较少,我应该怎么办?

  1. 找个“徒弟”(在学校找一个没学过C++的)或者一个一同学习的人会不会有帮助?

如果我的措辞不当或者某些观点出现问题,请指正。如果有表述不清的地方,或者各位大佬有解决之法,请at我(希望洛谷能够像一些比较强大的论坛能够实时通知,因为我还需要写作业QAQ,不是不重视这个,是因为要期末了)。

2023/1/10 22:14
加载中...