A 棋子

由贪心可知,能合成则合成,之后再结构体排序一下就可以了。

#include<bits/stdc++.h> 
using namespace std;
#define int long long//别忘了这个
int n;
struct player{
    int v;
    int i;
}a[100007];
bool cmp(player &a,player &b){
    if(a.v!=b.v)return a.v>b.v;
    return a.i<b.i;
}
signed main( )
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        int z,y,x;
        cin>>z>>y>>x;
        y+=z/3;
        z%=3;
        x+=y/3;
        y%=3;
        a[i].i=i;
        a[i].v=18*x+3*y+z;
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)cout<<a[i].i<<' ';
    cout<<'\n';
    return 0;
}

B 大海

因为每次只能往前走或者右拐(在同一个格子里不能多次右拐),那么走的路线是可能是“口”字型的,如果直接暴力枚举时间复杂度会到 $ O(n^4) $,无法通过。我们可以使用二位前缀和预处理出每个格子到(1,1)这段矩形区域的值总和,再枚举就可以了。

#include<bits/stdc++.h> 
using namespace std;
int g[1007][1007],n;
int main( )
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>g[i][j],g[i][j]=g[i][j]+g[i-1][j]+g[i][j-1]-g[i-1][j-1];
    int maxx=-1e9;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            maxx=max(maxx,g[i][j]-g[i-1][j-1]+g[i-1][1]+g[1][j-1]-g[1][1]);
        }
    }
    cout<<maxx+100<<'\n';
    return 0;
}

C 同构

因为数组长度为N且每个数在1到N之间且每个数都不相同,那么这两个数组一定是长度为N的排列。对于1~N的每个数,我们用数组 $a$ 存它在两个数组中的下标的差值。为满足条件,最后的数组 $a$ 只会存在 $ -k,k $ 或者0这样的数。例如 $[-2,-2,-2,0,0,2,2,2]$ 和 $[0,0,0,0,0]$ 是满足的,而 $[-2,-2,-2,0,0,1,2,2]$ 是不满足的。

#include<bits/stdc++.h> 
using namespace std;
int n,a[1000007];
void solve(){
    cin>>n;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        a[x]=i;
    }
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        a[x]-=i;
    }
    int vis=0;
    for(int i=1;i<=n;i++){
        if(a[i]==0)continue;
        if(vis==0)vis=abs(a[i]);
        else if(vis!=abs(a[i])){
            cout<<"No\n";
            return;
        }
    }
    cout<<"Yes\n";
}
int main( )
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int q;
    cin>>q;
    while(q--)solve();
    return 0;
}

D 网络ip

STL中map的运用

#include<bits/stdc++.h> 
using namespace std;
map<string,string>mp;
int n;
int main( )
{
    cin>>n;
    for(int i=0;i<n;i++){
        string a,b;
        cin>>a>>b;
        mp[b]=a;
    }
    int q;
    cin>>q;
    while(q--){
        string s;
        cin>>s;
        cout<<mp[s]<<'\n';
    }
    return 0;
}
posted on 2024-12-27 08:11  shaochang123  阅读(140)  评论(0)    收藏  举报