- 伍衍 的博客
七月DAY1 题解
- @ 2025-7-11 20:30:49
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;
}
思路:将拓扑排序,融入广搜之中。最开始我们先将入读我们定义一个 ans,存储答案,一个数组 mn 存储目前为止黄金售价最便宜的那一个价格。每到一个新的城镇,就更新 ans 为当前 ans /与/{[当前城镇黄金售价]减去[到目前为止黄金售价的最小值]}的最大值。然后,实时更新到当前城镇时黄金售价的最小值。然后把现在入度为 0 的所有城镇编号入队,进行下一步处理。