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编辑  收藏  举报

导航