T1

思路:大水题,略。注意用vector。

代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,m;
    cin >> n >> m;
    vector<vector<int> > a(n+1,vector<int> (m+1));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin >> a[i][j];
        }
    }for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            cout << a[j][i] << " ";
        }
        cout << endl;
    }
}

T2

思路:比第一题还水,略。

代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    string s;
    cin >> s;
    int b1,b2,r1,r2,k,b=0,r=0;
    for(int i=0;i<8;i++){
        if(s[i]=='B'&&b==0) b1=i,b=1;
        else if(s[i]=='B') b2=i;
        if(s[i]=='R'&&r==0) r1=i,r=1;
        else if(s[i]=='R') r2=i;
        if(s[i]=='K') k=i;
    }
    if(b1%2!=b2%2&&r1<k&&k<r2) cout << "Yes";
    else cout << "No";
}

T3

思路:我们可以在所有满足 a[i]≤m-d 的工作中选择 b[i] 最大的工作。这样,我们确保在剩下的 m-d 天内能够完成该工作并获得报酬。

具体步骤:

使用优先队列维护选择

i模拟时间

将所有元素入堆

如果有工作可做(堆非空),做工作

T4

思路:暴力枚举(-200,200)区间。

代码:(仅供参考,有点长,实际只需两层for循环(A,B),每层-200~200,最后判断结果(A^5-B^5==X)即可)

#include <bits/stdc++.h>
using namespace std;
unordered_map<long long, int> init(){
    unordered_map<long long, int> mp;
    for(int b=-200;b<=200;b++){
        long long mi=1ll;
        bool flag=0;
        for(int j=0;j<5;j++){
            mi*=b;
            if(abs(mi)>1ll<<50){
                flag=1;
                break;
            }
        }
        if(!flag){
            mp[mi]=b;
        }
    }
    return mp;
}
void find(int x){
    auto mp=init();
    for(int a=-200;a<=200;a++){
        long long A=1ll;
        bool flag=0;
        for(int j=0;j<5;j++){
            A*=a;
            if(abs(A)>1ll<<50){
                flag=1;
                break;
            }
        }
        if(flag){
            continue;
        }
        long long tg=A-x;
        if(mp.find(tg)!=mp.end()){
            int b=mp[tg];
            cout << a << " " << b << endl;
            return;
        }
    }
}
int main(){
    int x;
    cin >> x;
    find(x);
    return 0;
}

T5

思路:先分解质因数,求出每组p,e(p^e),对于每一组,求出一个最小的N使得N!是p^e的倍数,最后求出N的最大值即可。

代码:

#include <bits/stdc++.h>
using namespace std;
unordered_map<long long,int> fjzys(long long k){
    unordered_map<long long, int> fj;
    for(long long i=2;i<=k/i;i++){
        while(k%i==0){
            fj[i]++;
            k/=i;
        }
    }
    if(k>1){
        fj[k]++;
    }
    return fj;
}
long long find(long long p, long long e){
    long long l=0;
    long long r=p*e;
    long long ans=r;
    while(l<=r){
        long long mid=l+r>>1;
        long long cnt=0;
        long long cut=mid;
        while(cut>0){
            cut/=p;
            cnt+=cut;// 每组p^n的倍数均贡献1个p,所以要求p的每一次幂的倍数个数
        }
        if(cnt>=e){
            ans=mid;
            r=mid-1;
        }else{
            l=mid+1;
        }
    }
    return ans;
}
int main(){
    long long k;
    cin >> k;
    auto fj=fjzys(k);
    long long mx=0;
    for(const auto& it:fj){
        long long p=it.first;
        long long e=it.second;
        long long cut=find(p,e);
        if(cut>mx){
            mx=cut;
        }
    }
    cout << mx << endl;
    return 0;
}

T6T6

思路:将拓扑排序,融入广搜之中。最开始我们先将入读我们定义一个 ans,存储答案,一个数组 mn 存储目前为止黄金售价最便宜的那一个价格。每到一个新的城镇,就更新 ans 为当前 ans /与/{[当前城镇黄金售价]减去[到目前为止黄金售价的最小值]}的最大值。然后,实时更新到当前城镇时黄金售价的最小值。然后把现在入度为 0 的所有城镇编号入队,进行下一步处理。