T1T1

考试错误:无。

思路:

公式题(和昨天一样),公式为 min(n,k)×min(m,k)\min(n,k)\times\min(m,k)

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
        freopen("color.in","r",stdin);
        freopen("color.out","w",stdout);
        int n,m,k;
        cin >> n >> m >> k;
        cout << min(n,k)*min(m,k);
}

T2T2

考试错误:无。

思路:

直接模拟即可。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
        freopen("vigenere.in","r",stdin);
        freopen("vigenere.out","w",stdout);
        string miwen,miyao;
        cin >> miyao >> miwen;
        int myi=0;
        string ans=miwen;
        for(int i=0;i<miyao.size();i++){
                if(miyao[i]>='A'&&miyao[i]<='Z'){
                        miyao[i]=miyao[i]-'A'+'a';
                }
        }
        for(int i=0;i<ans.size();i++,myi=(myi+1)%miyao.size()){
                for(int j=1;j<=miyao[myi]-'a';j++){
                        ans[i]-=1;
                        if(ans[i]<'a'&&ans[i]>'Z'){
                                ans[i]='z';
                        }if(ans[i]<'A'){
                                ans[i]='Z';
                        }
                }
        }
        cout << ans;
}

T3T3

考试错误:骗了 4040

思路:

用一个双端二维数组存储每艘船的信息,每来一艘船就将超过 2424 小时的船弹出即可。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
unordered_map<int,int> mp;
deque<vector<int>> q;
const int N=1e5+50,h24=86400;
int nal;
signed main(){
        freopen("port.in","r",stdin);
        freopen("port.out","w",stdout);
        int n;
        cin >> n;
        for(int i=1;i<=n;i++){
                int t,k;
                cin >> t >> k;
                q.push_back({t});
                for(int i=1;i<=k;i++){
                        int x;
                        cin >> x;
                        if(!mp[x]) nal++;
                        mp[x]++;
                        q.back().push_back(x);
                }
                while(q.size()>1&&q.back()[0]-q.front()[0]>=h24){
                        for(int j=1;j<q.front().size();j++){
                                mp[q.front()[j]]--;
                                if(!mp[q.front()[j]]) nal--;
                        }
                        q.pop_front();
                }
                cout << nal << endl;
        }
}

T4T4

考试错误:输出 -11,骗了 77 分。

思路:

广搜的模版题,只是要注意加一个标记数组避免重复(再此特地感谢良心商家:钟柯哲哲)。

钟柯哲哲的博客

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
struct P{
        int x,y,step;
};
int mp[350][350],vis[350][350];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
queue<P> q;
int bfs(){
        q.push(P{0,0,0});
        while(q.size()){
                P now=q.front();
                q.pop();
                if(mp[now.x][now.y]==2e9){
                        return now.step;
                }
                if(mp[now.x][now.y]<=now.step){
                        continue;
                }
                for(int i=0;i<4;i++){
                        int nx=now.x+dx[i],ny=now.y+dy[i];
                        if(nx<0||ny<0||nx>301||ny>301) continue;
                        if(now.step+1>=mp[nx][ny]) continue;
                        if(vis[nx][ny]) continue;
                        vis[nx][ny]=1;
                        q.push(P{nx,ny,now.step+1});
                }
        }
        return -1;
}
signed main(){
        freopen("meteor.in","r",stdin);
        freopen("meteor.out","w",stdout);
        for(int i=0;i<=301;i++){
                for(int j=0;j<=301;j++){
                        mp[i][j]=2e9;
                }
        }
        int m;
        cin >> m;
        for(int i=1;i<=m;i++){
                int x,y,t;
                cin >> x >> y >> t;
                mp[x][y]=min(mp[x][y],t);
                if(y>0) mp[x][y-1]=min(mp[x][y-1],t);
                mp[x][y+1]=min(mp[x][y+1],t);
                if(x>0) mp[x-1][y]=min(mp[x-1][y],t);
                mp[x+1][y]=min(mp[x+1][y],t);
        }
        if(mp[0][0]==0){
                cout << -1;
                return 0;
        }
        cout << bfs();
}