acwing每日一题

#include<bits/stdc++.h>
using namespace std;
#define int long long

int n;
string s;

signed main()
{
	cin>>n>>s;
	
	if(s==string(n,'F'))
	{
		cout<<n<<endl;
		for(int i=0;i<n;i++)
		{
			cout<<i<<endl;
		}
	}
	else
	{
		int l=0,r=n-1;
		while(s[l]=='F') l++;
		while(s[r]=='F') r--;

		int low=0,high=0;
		auto str=s;
		for(int i=l;i<=r;i++)
		{
			if(str[i]=='F')
			{
				if(str[i-1]=='B') str[i]='E';
				else str[i]='B';
			}
			if(i>l && str[i]==str[i-1]) low++;
		}
		str=s;
		for(int i=l;i<=r;i++)
		{
			if(str[i]=='F') str[i]=str[i-1];
			if(i>l && str[i]==str[i-1]) high++;
		}
		int ends=l+n-1-r,d=2;
		if(ends) high+=ends,d=1;
		cout<<(high-low)/d+1<<endl;
		for(int i=low;i<=high;i+=d) cout<<i<<endl;
	}
}

 

贪心 

#include<bits/stdc++.h>
using namespace std;
#define int long long

signed main()
{
	string s;
	cin>>s;
	
	int ans=0;
	for(int i=0;i+1<s.size();i++)
	{
		char a=s[i],b=s[i+1];
		if(a==b || a=='?' || b=='?')
		{
			ans++;
			i++;
		}
	}
	cout<<ans;
}

 

二分+区间和并 

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define x first
#define y second
const int N=1e5+10;
int n,m;
pii w[N],q[N];

bool check(int x)
{
	int num=0;
	for(int i=0;i<n;i++)
	{
		int L=w[i].x,S=w[i].y;
		if(S<=x)
		{
			int t=x-S;
			int l=max(1LL,L-t),r=min(m,L+t);
			q[num++]={l,r};
		}
	}
	sort(q,q+num);
	int st=-1,ed=-1;
	for(int i=0;i<num;i++)
	{
		if(q[i].x<=ed+1) ed=max(ed,q[i].y);
		else st=q[i].x,ed=q[i].y;
	}
	return st==1 && ed==m;
}

signed main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++) cin>>w[i].x>>w[i].y;
	int l=0,r=2e9+10;
	while(l<r)
	{
		int mid=l+r>>1;
		if(check(mid)) r=mid;
		else l=mid+1;
	} 
	cout<<l;
} 

 

数学 

#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve()
{
	int n;
	cin>>n;
	int m=0,d=0;
	while(n)
	{
		m++;
		if(n%3==1 && d==0) d=m;
		n-=(n+2)/3;
	}
	cout<<m<<" "<<d;
}

signed main()
{
	int t=1;
	//cin>>t;
	while(t--) solve();
}

 

 

 贪心

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int n,d;
int v[N],a[N];

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>d;
	for(int i=1;i<n;i++) cin>>v[i];
	for(int i=1;i<=n;i++) cin>>a[i];
	int res=0;
	int oil=0,dist=0;
	int price=a[1];
	for(int i=2;i<=n;i++)
	{
		dist+=v[i-1];
		int t=(dist+d-1)/d-oil;
		res+=t*price;
		oil+=t;
		price=min(price,a[i]);
	}
	cout<<res;
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值