打开石门
只要有相连的一样字母就可以消成一个
string s;
int ans;
void solve()
{
cin >> s;
int len = 0;
for (int i = 0;i < s.size();i ++)
{
if (s[i] == 'L') len ++;
else //遇到Q
{
ans += (len ? 1 : 0); //消除累计的L
len = 0;
ans ++;//遇到Q
}
}
//QLLLL时,最后遇不到Q让累计的L消除,手动让它遇到Q
ans += (len ? 1 : 0);
int tmp = 0;
len = 0;
for (int i = 0;i < s.size();i ++)
{
if (s[i] == 'Q') len ++;
else
{
tmp += (len ? 1 : 0);
len = 0;
tmp ++;
}
}
tmp += (len ? 1 : 0);
cout << min(ans,tmp) << endl;
}
青铜门上的涂鸦
敲打骷髅兵
找规律即可
1~ 2~ 4~ 8...以此类推
|| || || ||
1 2 3 4 cout << 2^x - 1
int n;
int test(int n)
{
if (n == 0) return 0;
int cnt = 0;
while(n)
{
n >>= 1;
cnt ++;
}
return (1 << cnt) - 1;
}
void solve()
{
cin >> n;
cout << test(n) << endl;
}
净化王胖子
差分求解:将走过的每个房间之间的间隔 都+1
//差分求解:将走过的每个房间之间的间隔 都+1
int n,k;
int a[N],b[N];//b[] 差分数组 范围1 ~ n - 1:有n - 1个间隔
int id[N];
bool cmp(const int& x,const int& y)
{
return x > y;
}
struct Node
{
double l, r;
bool operator< (const Node& t) const
{
return r < t.r;
}
}Nodes[N];
void solve()
{
cin >> n >> k;
for (int i = 1;i <= n;i ++)
{
cin >> a[i];
id[a[i]] = i;//记录顺序
}
for (int i = 1;i < n;i ++)
{
int x = id[i],y = id[i + 1];
if (x < y) b[x] ++,b[y] --;
else b[y] ++,b[x] --;
}
for (int i = 1;i <= n;i ++)
b[i] += b[i - 1];
// for (int i = 1;i < n;i ++) cout << b[i] << ' ';
sort(b + 1,b + n,cmp);
int cnt = 0;
for (int i = 1;i < n;i ++)
{
if (k > 0)
{
k -= b[i];
cnt ++;
}
}
if (k > 0) cout << -1 << endl;
else cout << cnt << endl;
}