小Y是这个
本题十分简单:叭叭了一大堆表达了
一行字,由“0”,“1”组成
判断有几个连续的字符(如“000000”“111”等)
#include<bits/stdc++.h>
using namespace std;
int n,a[1000010],cnt;
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n-1;i++)
{
if(a[i]!=a[i+1]) cnt++;
}
cout<<cnt;
return 0;
}
2:
选择比右边大且在数中靠左的数删去
用字符串
#include<bits/stdc++.h>
using namespace std;
int k;
string n;
int main()
{
cin>>n>>k;
for(int i=0;i<n.size()-1;i++)
{
if(k==0) break;
if(n[i]>n[i+1]){
// cout<<n[i]<<endl;
n.erase(i,1);
i-=2;
i=max(i,-1);
k--;
}
}
if(k)
n.erase(n.size()-k);
int j=0;
while(j<n.size()-1)
{
if(n[j]!='0') break;
j++;
}
for(;j<n.size();j++)
{
cout<<n[j];
}
return 0;
}
3:
秘诀:转二进制
#include<bits/stdc++.h>
using namespace std;
long long a,b;
int main()
{
cin>>a>>b;
long long sum=a,cnt=0;//表示已经选择了和为a的月饼
for(int i=0;i<63;i++)
{
/*a&1=1---> 已经选择了这块
a&1=2---> 没有选择这块
如果没有选,尝试选择它
*/
if((a&1)==0&&sum+(1ll<<i)<=b)
{
sum+=(1ll<<i);
cnt++;
}
//将已经选过的统计上
if(a&1==1) cnt++;
a>>=1;
}
cout<<cnt<<endl;
return 0;
}
4:
分成2部分
加正和加负
先加门槛低的正数,再加高的
先加t+b大的负数
#include<bits/stdc++.h>
using namespace std;
struct node
{
int t,b;
}p1[100010],p2[100010];
bool cmp1(node a,node b)
{
return a.t<b.t;
}
bool cmp2(node a,node b)
{
return b.b+b.t<a.b+a.t;
}
void haha()
{
long long n,T;
cin>>n>>T;
int c1=0,c2=0;
for(int i=1;i<=n;i++)
{
int t,b;
cin>>t>>b;
if(b>=0) p1[++c1]={t,b};
else p2[++c2]={t,b};
}
sort(p1+1,p1+c1+1,cmp1);
sort(p2+1,p2+c2+1,cmp2);
for(int i=1;i<=c1;i++)
{
if(T>p1[i].t){
T+=p1[i].b;
}else {
cout<<"-1s\n";
return ;
}
}
for(int i=1;i<=c2;i++)
{
if(T>p2[i].t){
T+=p2[i].b;
if(T<=0){
cout<<"-1s\n";
return ;
}
}else {
cout<<"-1s\n";
return ;
}
}
cout<<"+1s\n";
}
int main()
{
int z;
cin>>z;
for(int i=1;i<=z;i++)
{
haha();
}
return 0;
}