第一题:可将矩阵看成一维数组a[N*N],进行简单运算即可。(一维转二维公式)

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,t;
    cin>>n>>t;
    t%=(n*n);
    int a=t/n+1,b=t%n+1;
    cout<<a<<' '<<b;
    return 0;
}

第二题:运用结构体,w:所含灵石数量;h:传送所需灵石数量;ca:差。 对h从小到大进行排序,接着i从1到n循环,如果碰到传送所需灵石>此刻现有灵石数量,直接跳出;如果差<0,则视为不利,continue。 最后输出现有灵石数量即可。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
struct Node{
    int w,h,ca; 
}a[N];
bool cmp(Node x,Node y)
{
    return x.h<y.h;
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)
    {
        scanf("%d%d",&a[i].w,&a[i].h);
        a[i].ca=a[i].w-a[i].h;
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;++i)
    {
        if(a[i].h>m) break;
        if(a[i].ca<=0) continue;
        m+=a[i].ca;
    }
    printf("%d",m);
    return 0;
}

第三题:找!规!律! 可发现输出仅有2种:0、1。 若数组和第一次跳跃后排列相同,则直接输出0。 此刻我们会下意识用cnt计数,可尝试几个样例后发现,除0、1之外无他数,可判断如果第一次有不相同的,必定是1,直接return 0。循环结束则表明全部相同,输出0即可。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
int a[N],b[N];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        scanf("%d",a+i);
        b[i]=a[i];
    }
   
    bool done=true;
    for(int i=1;i<=n;++i)
    {
        for(int j=n;j>=i;--j)
        {
            if(a[j]>=a[i])
            {
                if(a[j]!=b[i])
                {
                    puts("1");
                    return 0;
                }
                b[i]=a[j];
                break;
            }
        }
    }
    puts("0");
    return 0;
}

第四题 一个背包(和采药类似),一个类似区间dp 有点像CSP2019 纪念品

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e4+7,M=207;
LL n,m,T,w[N],f[N][37],a[N];
int main()
{
    scanf("%d%d%d",&n,&m,&T);
    for(int i=1,k;i<=n;++i)
    {
        scanf("%d",&k);
        memset(w,0,sizeof w);
        for(int j=1,v,t;j<=k;++j){
            scanf("%d%d",&v,&t);
            for(int u=T;u>=t;--u)
                w[u]=max(w[u],w[u-t]+v);
        }
        f[i][1]=a[i]=w[T];
    }
    for(int j=2;j<=m;++j)
        for(int i=1;i+j-1<=n;++i)
            f[i][j]=max((f[i][j-1]<<1)+a[i+j-1],(f[i+1][j-1]<<1)+a[i]);
    LL ans=0;
    for(int i=1;i+m-1<=n;++i) ans=max(ans,f[i][m]);
    cout<<ans;
    return 0;
}

总结:这一次不算太难,特别第三题,得分很容易。没有出现图论和最小生成树问题。 Goodbye!