1001-Theramore
题意提炼
给定一个长度为 n 的,由 ‘ 0 ’ ,’ 1 ‘ 组成的字符串,我们可以选择一个长度为奇数的区间(最小是 3 ),将区间内的数进行翻转,再进行若干次操作后使得该字符串的字典序最小
思考分析
翻转操作并不能改变移动的字符的下标的奇偶性,所以我们直接统计下标为奇数或偶数的 ’ 1 ‘ 的个数,然后再把它们移动到字符串最后边即可
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
string s;
int sum1,sum2;
while(t--)
{
cin>>s;
sum1=0;
sum2=0;
for(int i=s.length()-1;i>=0;i-=2)
{
if(s[i]=='1')
sum1++;
}
for(int i=s.length()-2;i>=0;i-=2)
{
if(s[i]=='1')
sum2++;
}
for(int i=s.length()-1;i>=0 && sum1;i-=2)
{
s[i]='1';
sum1--;
if(sum1==0)
{
for(int j=i-2;j>=0;j-=2)
s[j]='0';
}
}
for(int i=s.length()-2;i>=0 && sum2;i-=2)
{
s[i]='1';
sum2--;
if(sum2==0)
{
for(int j=i-2;j>=0;j-=2)
s[j]='0';
}
}
cout<<s<<endl;
}
}
1004-Quel'Thalas
题意分析
没什么好说的,输出 2 * n 即可
1011-Stormwind
题意提炼
有一块长为 m 宽为 n 的石头,而我们需要面积为 k 的石头( k < = m * n ),我们只能横着或者竖着切这块石头,而且尽量让切的次数最多
思考分析
直接贪心就行了
AC代码
#include<bits/stdc++.h>
#define ll long long
#define int long long
#define endl '\n'
using namespace std;
ll n,m,k;
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t; cin>>t;
while(t--){
cin>>n>>m>>k;
if(n*m<k){
cout<<0<<endl;
continue;
}
ll ans=0;
if(m>=k){ // 切成条
ll cnt=n-1;
cnt+=m/k-1;
ans=max(ans,cnt);
}
else{ // m<k
ll d=(k+m-1)/m;
ll cnt=n/d-1;
ans=max(ans,cnt);
}
if(n>=k){ // 从另外一边切
ll cnt=m-1;
cnt+=n/k-1;
ans=max(ans,cnt);
}
else{ // n<k
ll d=(k+n-1)/n;
ll cnt=m/d-1;
ans=max(ans,cnt);
}
cout<<ans<<endl;
}
return 0;
}