2024牛客寒假算法基础集训营4
2024牛客寒假算法基础集训营4
A.柠檬可乐
思路:
简单的模拟,按照题目描述判断大小即可
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()
void solve(){
int a,b,k;
cin>>a>>b>>k;
if(a>=k*b) cout<<"good";
else cout<<"bad";
}
signed main(){
ios::sync_with_stdio(false); cin.tie(nullptr);
int t=1;
// cin>>t;
while(t--){
solve();
}
return 0;
}
B.左右互博
思路
讨厌鬼和小甜妹都是采用的最佳策略,这里我认为最佳策略就是每次分裂都必须有一个1,这样我们就保证了其中一个是无法继续分裂的,因此我们只要将所有不为1的数字加在一起就可以了
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()
void solve(){
int n; cin>>n;
std::vector<int> a(n+1);
int ans=0;
for(int i=1;i<=n;i++){
cin>>a[i];
ans+=(a[i]-1);
}
if(ans%2){
cout<<"gui"<<endl;
}
else{
cout<<"sweet"<<endl;
}
}
signed main(){
ios::sync_with_stdio(false); cin.tie(nullptr);
int t=1;
// cin>>t;
while(t--){
solve();
}
return 0;
}
C.冬眠
思路
按理说模拟即可,大家可以去试试,后续补题有点发懒了,所以就没有认真看看
Code
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n,m,x,y ;
char a[N][N];
int p,q;
int op[110] , z[110];
int main()
{
cin >> n >> m >> x >> y;
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 1 ; j <= m ; j ++)
{
cin >> a[i][j];
}
}
cin >> p >> q;
for(int i = 1 ; i <= q ; i++) cin >> op[i] >> z[i];
while(p --)
{
for(int i = 1 ; i <= q ; i ++)
{
if(op[i] == 1)
{
for(int j = m ; j >= 1 ; j --) a[z[i]][j+1] = a[z[i]][j];
a[z[i]][1] = a[z[i]][m+1];
}
if(op[i] == 2)
{
for(int j = n ; j >= 1 ; j --) a[j+1][z[i]] = a[j][z[i]];
a[1][z[i]] = a[n+1][z[i]];
}
}
}
cout<<a[x][y];
}
D.守恒
思路
数组a可以进行任意次操作,因为是一个数+1,一个数-1,所以总和其实一直没有变,这里就可以呃理解为,总和的因子乘以数组的长度是不是小于等于数组的总和(好吧,这里说的有点绕)
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()
void solve(){
int n; cin>>n;
std::vector<int> a(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
int ans=0;
for(int i=1;i<=n;i++){
ans+=a[i];
}
int res=0;
if(n==1){
cout<<1<<endl;
return ;
}
else{
// int up1=sqrt(ans)+1;
for(int i=1;;i++){
if(ans/i<n){
break;
}
if(ans%i==0){
res++;
}
}
}
cout<<res<<endl;
}
signed main(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr), std::cout.tie(nullptr);
// ios::sync_with_stdio(false); cin.tie(nullptr);
int t=1;
// cin>>t;
while(t--){
solve();
}
return 0;
}
E.漂亮数组
思路
这应该是一个贪心题,我们如何去找是k的倍数的一个子数组呢,事实上这一步就需要用到前缀和思想,我们将给定的数组进行前缀和处理,方便后续的使用,之后我们找到两个前缀和余数相同的地方,那么以这两个位置中间的子数组就是一个漂亮数组,但是我们需要保证的是靠左的那个位置应该是要比我们之前已经分好的位置要大,不然也会影响到之前我们分好的数组,这里我用的map,但是用set也是可以的
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()
void solve(){
int n,k; cin>>n>>k;
std::vector<int> a(n+1);
std::vector<int> s(n+1,0);
std::map<int, int> mp;
mp[0]=0;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]+a[i];
}
int ans=0;
int pre=-1;
for(int i=1;i<=n;i++){
if(mp.count(s[i]%k)&&mp[s[i]%k]>=pre){
ans++;
pre=i;
}
mp[s[i]%k]=i;
}
cout<<ans<<endl;
}
signed main(){
int t=1;
while(t--){
solve();
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!