Codeforces Round 952 (Div. 4)
知识点模块
1.一个正方体x,y,z里面可以放多少个边长为a,b,c的长方体
ans=(x-a+1)*(y-b+1)*(z-c+1)
题解模块
A.Creating Words
交换两个字母的首字母即可swap实现即可
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()
void solve()
{
string a,b;
cin>>a>>b;
swap(a[0],b[0]);
cout<<a<<" "<<b;
cout<<endl;
}
signed main()
{
int t=1;
cin>>t;
while(t-- ) solve();
return 0;
}
B. Maximum Multiple Sum
要让一个数的倍数加起来总和最大,显然就是只要这个数不是3的时候,任何一个数(题给的数范围大于等于2)的2和其倍数的总和加起来最大。因为2的倍数会在这个范围里数量最多,不会有一个奇数比2的倍数多,任何偶数都是2的倍数
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()
void solve()
{
int n;
cin>>n;
if(n==3) cout<<3<<endl;
else cout<<2<<endl;
}
signed main()
{
int t=1;
cin>>t;
while(t-- ) solve();
return 0;
}
C. Good Prefixes
从左往右按顺序遍历,每次算前缀和,减掉当前遍历到的这些数的最大值,如果这个数等于该最大值,说明前面这个几个数加起来就是这个最大值,符合题意
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()
void solve()
{
int n;
cin>>n;
vector<int>v(n);
for(int i=0;i<n;i++) cin>>v[i];
int sum=0,maxx=0,ans=0;
for(int i=0;i<n;i++)
{
sum+=v[i];
maxx=max(maxx,v[i]);
if(sum-maxx==maxx) ans++;
}
cout<<ans<<endl;
}
signed main()
{
int t=1;
cin>>t;
while(t-- ) solve();
return 0;
}
D. Manhattan Circle
直接锁定最多#的这一行,然后记录一下最多有几个这个符号,记录一下这行的最后一个#的位置,然后就可以根据数量和最后一个位置推出他的中心
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()
void solve()
{
int n,m;
cin>>n>>m;
string s;
int maxx=-1,ans=0,cc=0;
for(int i=1;i<=n;i++)
{
cin>>s;
int cnt=0,pos=0;
for(int j=0;j<s.size();j++)
{
if(s[j]=='#') {
cnt++;
pos=j;
}
maxx=max(maxx,cnt);
if(maxx==cnt) ans=pos,cc=i;
}
}
cout<<cc<<" "<<ans+1-maxx/2<<endl;
}
signed main()
{
int t=1;
cin>>t;
while(t-- ) solve();
return 0;
}
E. Secret Box
1.因为小方体的体积是k,所以边长一定是k的除数,那么就可以枚举a,b然后c用k%(a * b),如果不是0或者大于z退出循环
2.然后用知识点1,计算验证取最大值即可
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()
void solve()
{
int x,y,z,k;
int ans=0;
cin>>x>>y>>z>>k;
for(int i=1;i<=x;i++)
{
for(int j=1;j<=y;j++)
{
if(k%(i*j)) continue;//必须是k的除数
int c=k/(i*j);
if(c>z) continue;
int tt=(x-i+1)*(y-j+1)*(z-c+1);
ans=max(tt,ans);
}
}
cout<<ans<<endl;
}
signed main()
{
int t=1;
cin>>t;
while(t-- ) solve();
return 0;
}
F. Final Boss
1.使用set容器存放点,每个点{turn,i},就是攻击力的轮数和攻击力大小的索引,每一轮攻击完以后,删除这个点,然后存对应攻击可以使用的下一次轮数{turn+c[i],i},然后直到h<0即可
2.为什么这样可以满足最小回合呢?因为你第一轮如果没法将boss杀死以后,攻击力大的对应的使用轮数也会大,所以按照上述存放点是可以满足的
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()
void solve()
{
int h,n;
cin>>h>>n;
vector<int>a(n),c(n);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>c[i];
set<pii>se;
for(int i=0;i<n;i++) se.insert({1,i});
int ans=1;
while(h>0)
{
auto [turn,i]=*se.begin();
se.erase(se.begin());
h-=a[i];
ans=turn;
se.insert({turn+c[i],i});
}
cout<<ans<<endl;
}
signed main()
{
int t=1;
cin>>t;
while(t-- ) solve();
return 0;
}
G. D-Function
等我补补
posted on 2024-06-17 23:51 swj2529411658 阅读(27) 评论(0) 编辑 收藏 举报