第一题:小红的单词处理
小红拿到了用空格隔开的两个单词。她希望你先输出第二个单词,再输出第一个单词。你能帮帮她吗?
利用c/c++的特性自动忽略空格
#include<iostream>
using namespace std;
int main(){string a,b;cin>>a>>b;cout<<b<<endl;cout<<a;
}
第二题:小红煮汤圆
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
元宵节快到了,小红作为甜食爱好者,非常喜欢吃汤圆,因此对元宵节也是很期待的。
小红前往超市买了n袋汤圆,每袋汤圆有x颗。小红每次煮k颗汤圆,请你计算小红一共可以煮多少次,以及每次会打开几袋?
小红非常节约,每次用完了一袋汤圆才会开新的一袋。
直接模拟这个过程就行
我这个代码复杂度比较高点,O(n)复杂度
#include<iostream>
using namespace std;
int n,x,k;
bool y;
long long panduan(int a,bool y){if(!y) return 0;else{if(a<=x) return 1;else if(a%x==0) return a/x;else return (x+a)/x;}
}
int main(){cin>>n>>x>>k;//小红购买的袋数、每袋的汤圆数量,以及小红每次煮的汤圆数量int target=0;int i;cout<<n*x/k<<endl;cout<<panduan(k,true)<<" ";int sum=panduan(k,true);for(i=2;i<=n*x/k;i++){target=i*k-sum*x;if(target<=0) y=false;else y=true;sum+=panduan(target,y);cout<<panduan(target,y)<<" ";}}
也可以直接用数学公式O(1)的复杂度,简化
void solve(){int n,x,k;scanf("%d%d%d",&n,&x,&k);printf("%d\n",n*x/k);int now=0;for(int i=1;i<=n*x/k;i++){printf("%d ",i*k/x+(i*k%x?1:0)-now);now=i*k/x+(i*k%x?1:0);}
}
第三题:小红的 01 串
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
小红拿到了一个 01 串,她可以进行以下两种操作:
- 删除第一个字符。
- 删除第二个字符。
操作若干次后(可以操作 0 次),将得到一个最终的字符串。该字符串每个'1'字符将增加 1 分,每个'0'字符将减少 1 分。小红希望最终的分数尽可能大,你能帮小红求出这个分数吗?
这就是典型的贪心策略
首先先把前面的0全部都去掉,直到遇到第一个1为止,之后一直进行操作二即可
#include <bits/stdc++.h>
using namespace std;
#define rep(X,L,R) for(int X=(L);X<=(R);++X)
#define per(X,L,R) for(int X=(L);X>=(R);--X)
typedef long long ll;int main(){ios::sync_with_stdio(0);cin.tie(0);string s;cin>>s;int n=s.length(),cur=0,cnt=count(s.begin(),s.end(),'1'),ans=!!cnt;reverse(s.begin(),s.end());rep(i,0,n-1){cur+=s[i]=='1'?1:-1;cnt-=s[i]=='1';ans=max(ans,cur+!!cnt);}cout<<ans;return 0;
}
第四题:小红的数组清空
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
小红拿到了一个数组,她准备用尽可能少的代价将该数组全部清空。
小红有两种操作:
1. 直接删除一个元素x,花费代价为 1。
2. 若上一个删除的元素为x,那么直接删除一个元素x+1,花费代价为 0。该操作仅当x+1在数组中存在时才可进行。
请你求出小红清空整个数组的最小代价。
思路:找到连续的区间只删一次,达到最优化
【1】 利用sort库排序
【2】利用map统计每个数出现的次数,优先使用操作1,删除最小值,一直操作二
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
using i64=long long ;
using ld=long double;
const int N=2e5+10;
const int mod=1e9+7;
int a[N];
void solve(){int n;cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);int ans=0;map<int,int> mp;for(int i=1;i<=n;i++){if(mp[a[i]-1]) mp[a[i]-1]--,mp[a[i]]++;else mp[a[i]]++;}for(auto [x,y]:mp) ans+=y;cout<<ans<<endl;
}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int t=1;
// cin>>t;while(t--) solve();return 0;
}