牛客周赛33

第一题:小红的单词处理

小红拿到了用空格隔开的两个单词。她希望你先输出第二个单词,再输出第一个单词。你能帮帮她吗?

利用c/c++的特性自动忽略空格

#include
using namespace std;
int main(){
  string a,b;
    cin>>a>>b;
    cout<

第二题:小红煮汤圆

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

元宵节快到了,小红作为甜食爱好者,非常喜欢吃汤圆,因此对元宵节也是很期待的。
小红前往超市买了n袋汤圆,每袋汤圆有x颗。小红每次煮k颗汤圆,请你计算小红一共可以煮多少次,以及每次会打开几袋?
小红非常节约,每次用完了一袋汤圆才会开新的一袋。

直接模拟这个过程就行

我这个代码复杂度比较高点,O(n)复杂度

#include
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<

也可以直接用数学公式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 
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<

 

第四题:小红的数组清空

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

小红拿到了一个数组,她准备用尽可能少的代价将该数组全部清空。
小红有两种操作:
1. 直接删除一个元素x,花费代价为 1。
2. 若上一个删除的元素为x,那么直接删除一个元素x+1,花费代价为 0。该操作仅当x+1在数组中存在时才可进行。

请你求出小红清空整个数组的最小代价。

思路:找到连续的区间只删一次,达到最优化

【1】 利用sort库排序

 【2】利用map统计每个数出现的次数,优先使用操作1,删除最小值,一直操作二

#include
#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 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<>t;
	while(t--) solve();
	return 0;
}

你可能感兴趣的:(牛客赛事,c++,算法,开发语言)