牛客周赛33

小红的单词整理​​​​​​

语法

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+6;
void solve() {
	string a,b;
	cin >> a >> b;
	cout<<b<<'\n';
	cout<<a;
}
signed main(){
	cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
	int t = 1;
//	cin >> t;
	while(t--){
		solve();
	}
}

小红煮汤圆

模拟

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+6;
int ans[N];
int cnt=0;
void solve() {
	int n,x,k;
	cin >> n >> x >> k;
	int sum=0;
	int c=0;
	for(int i=1;i<=n;i++){
		sum+=x;
		c+=1;
		while(sum>=k){
			ans[++cnt]=c;
			c=0;
			sum-=k;
		}
        
	}
    
    cout<<cnt<<'\n';
	for(int i=1;i<=cnt;i++){
		cout<<ans[i]<<' ';
	}
}
signed main(){
	cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
	int t = 1;
//	cin >> t;
	while(t--){
		solve();
	}
}

小红的 01 串

贪心后缀和

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+6;
int r[N];
int l[N];
void solve() {
	string a;
	cin >> a;
	int len=a.length();
	int sum=0;
	int mx=0;
    int mi=0;
    int cnt=0;
    int dd=0;
    int ans=0;
    r[len]=0;
    for(int i=len-1;i>=0;i--){
        if(a[i]=='1')sum++;
        else sum--;
        r[i]=sum;
    }
    ans=max(ans,r[0]);
   // cout<<sum<<'\n';
    int boo=0;
	for(int i=0;i<len;i++){
        if(a[i]=='1'&&cnt<1){
            cnt++;
        }
        else if(cnt==1&&a[i]=='1') boo=1;
        else if(cnt==1&&a[i]=='0') boo=0;
       // cout<<dd<<'\n';
        ans=max(ans,boo+r[i+1]+cnt);
    }
    
    cout<<ans;
}
signed main(){
	cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
	int t = 1;
//	cin >> t;
	while(t--){
		solve();
	}
}

小红的数组清空

哈希贪心

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+6;
void solve() {
	map<int,int>mp;
    map<int,int>mp1;
	int n;
	cin >> n;
	for(int i=1;i<=n;i++){
		int x;
		cin >> x;
		mp[x]+=1;
	}
	int ans=0;
	for(auto[i,j]:mp){
		int x=mp1[i-1];
        int k=j;
        ans+=max(0ll,k-x);
        mp1[i]=j;
	}
	cout<<ans;
}
signed main(){
	cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
	int t = 1;
//	cin >> t;
	while(t--){
		solve();
	}
}

小红勇闯地下城

题解dijsta

我写的spfa

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+6;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void solve() {
	int n,m,c;
	cin >> n >> m >> c;
	string a[n];
	int vis[n+2][m+2];
	int x,y;
	for(int i=0;i<n;i++){
		cin >> a[i];
		for(int j=0;j<m;j++){
			if(a[i][j]=='S'){
				x=i,y=j;
			}
			vis[i][j]=-1;
		}
	}
	queue<pair<int,int>>q;
	queue<int>p;
	p.push(c);
	q.push({x,y});
	while(q.size()){
		int i=q.front().first;
		int j=q.front().second;
		int h=p.front();
      //  cout<<i<<' '<<j<<' '<<h<<'\n';
		q.pop();
		p.pop();
		if(a[i][j]=='T'){
			cout<<"Yes"<<'\n';
			return;
		}
		for(int k=0;k<4;k++){
			int qx=i+dx[k];
			int qy=j+dy[k];
			if(qx<0||qy<0||qx>=n||qy>=m) continue;
			int w=a[qx][qy]-'1'+1;
			if(a[qx][qy]=='T'||a[qx][qy]=='S') w=0;
			int now=h-w;
			if(now<=vis[qx][qy]) continue;
			vis[qx][qy]=now;
			if(now){
				q.push({qx,qy});
				p.push(h-w);
			}
		}
	}
	cout<<"No"<<'\n';
}
signed main(){
	cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
	int t = 1;
	cin >> t;
	while(t--){
		solve();
	}
}

小红的数组操作(已补

2300斜线优化dp(似乎用不到斜线优化,写个单调栈就可以通过了?

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e3+6;
int n;
int a[N],ans[N];
void solve() {
	 cin>>n;
	    int mn=LLONG_MAX;
	    for(int i=1;i<=n;i++){
	        cin>>a[i];a[i]-=i;
	        mn=min(mn,a[i]);
	    }
	    vector<pair<int,int>>st;
	    for(int i=1;i<=n;i++){
	        a[i]-=mn;
	        int sum=a[i],cnt=1;
	        while(st.size()&&st.back().first>sum/cnt){
	            sum+=st.back().first*st.back().second;
	            cnt+=st.back().second;
	            st.pop_back();
	        }
	        st.push_back({sum/cnt,cnt-sum%cnt});
	        if(sum%cnt)st.push_back({sum/cnt+1,sum%cnt});
	    }
	    int r=n;
	    while(st.size()){
	       // cout<<st.back().first<<' '<<st.back().second<<'\n';
	        for(int i=1;i<=st.back().second;i++){
	            ans[r--]=st.back().first;
	        }
	        st.pop_back();
	    }
	    int res=0;
	//     for(int j=1;j<=n;j++){
	// 			cout<<a[j]<<' ';
	// 		}
	//     cout<<'\n';
	//      for(int j=1;j<=n;j++){
	// 			cout<<ans[j]<<' ';
	// 		}
	//     cout<<'\n';
	    for(int i=1;i<=n-1;i++){
	        int need=a[i]-ans[i];
	        a[i]-=need;
	        a[i+1]+=need;
	        res+=need;
	       
	    }
	    cout<<res<<"\n";
	    for(int i=1;i<=n;i++)cout<<ans[i]+i+mn<<" ";
	        cout<<"\n";
}
signed main(){
	cin.tie(0);cout.tie(0);
	ios::sync_with_stdio(0);
	int t = 1;
//	cin >> t;
	while(t--){
		solve();
	}
}

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值