A - Rating Increase:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
string a;
cin>>a;
int i;
for(i=1;a[i];i++){
if(a[i]!='0'){ //从字符串第二个开始只要不是0直接截取;
string b,c;
b=a.substr(0,i);
c=a.substr(i);
if((b.size()==c.size()&&b<c)||(b.size()<c.size())) //判断前面的数小于后面的数;
{
cout<<b<<' '<<c<<endl;break;}
}
}
if(a[i]==0)cout<<-1<<endl;
}
}
B - Swap and Delete:
这道题我的想法就是把这零和一统计一下个数,用f0和f1统计,从最开始统计1就需要0,0需要1,一旦大于f0和f1就满足不了了,后面就是要扔掉的,也就是统计长度计算出所需钱财即可;
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int f0=0,f1=0;
int cnt0=0,cnt1=0;
string a;
cin>>a;
for(int i=0;a[i];i++){
if(a[i]=='0')f0++;
else f1++;
}
if(f1==f0){cout<<"0"<<endl; //如果这两相等直接输出0;
continue; //跳过当前循环,不执行下面程序了;
}
for(int i=0;a[i];i++){
if(a[i]=='1')cnt0++;
else cnt1++;
if(cnt1>f1||cnt0>f0){
string c;
c=a.substr(i); //从i后面的字符串都不能靠换位置得到,就是需要删除的;
cout<<c.size()<<endl;//统计需要删除的字符串即可;
break;
}
}
}
}
C - Game with Multiset:
就是y可以看成二进制数,就是2的i次方相加的形式,然后找看是否能够找到二进制每位上的1所对应的2的次数。
同时在x=1的数组中如果出现两个相等的数例如有两个3,就相当于有个4;这里用到一个位运算和一个累加。
#include <bits/stdc++.h>
using namespace std;
const int N = 40;
int s[N];
void get(int x)
{
int sum = 0;
for (int i=0;i<=30;i++)
{
sum += s[i];
if (x >> i & 1) //取二进制数上的每一位,如果是一的话证明该位需要一个2的i次方;
{
if (!sum)
{
puts("NO");
return;
}
else
sum --;
}
sum >>= 1; //将多余的相同的指数转为更高的,两个相同即可进一。
}
puts("YES");
}
int main()
{
int m;
scanf("%d", &m);
while (m--)
{
int x,y;
scanf("%d%d", &x, &y);
if (x == 1)
s[y] ++;
else
get(y);
}
return 0;
}