Sierpinski carpet
据题知,此题应该用递归的方法输出谢尔宾斯基地毯图形
AC代码:
#include<bits/stdc++.h>
using namespace std;
int arr[1003][1003];
void digui(int x,int y,int jishu){
if(jishu==0){
arr[x][y]=1;
return ;
}
int t = jishu/3;
digui(x,y,t);
digui(x+t,y,t);
digui(x+t+t,y,t);
digui(x,y+t,t);
digui(x,y+t+t,t);
digui(x+t,y+t+t,t);
digui(x+t+t,y+t,t);
digui(x+t+t,y+t+t,t);
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n;
cin>>n;
int t = pow(3,n);
digui(1,1,t);
for(int i=1;i<=t;i++){
for(int j=1;j<=t;j++){
if(arr[i][j]==1) cout<<"#";
else cout<<".";
}cout<<endl;
}
return 0;
}
Consecutive
题意为找寻指定位置字符串中满足Sp == Sp+1 这一情况的数目,暴力写法会TLE,所以要采用前缀和优化,答案即为给出两位置对应前缀和之差
AC代码:
#include<bits/stdc++.h>
using namespace std;
int a[1000006];
int main(){
int n,q;
cin>>n>>q;
string s="?",s1;
cin>>s1;
s += s1;
for(int i=1;i<s.size();i++){
if(s[i]==s[i+1]){
a[i+1]=1;
}
}
for(int i=1;i<s.size();i++){
a[i] += a[i-1];
}
while(q--){
int l,b,cnt=0;
cin>>l>>b;
cout<<a[b]-a[l]<<endl;
}
return 0;
}
Minimum Width
本题的题意为,在限定的行数下,行宽最小为多少能装下给出的句子,第二行输入为句子中每个词的长度,若两词要放在同一行,则必须加一个空格
此题可用二分法来做,最长词的长度为left, 所有词语放在一行的情况为right
通过一个判断函数(judge(mid))来变换左右端点(sum = -1的情况可以正好抵消掉行首词语也加上的空格)(sum确认加上单词后还能放在一行中再把单词加入到sum中去)
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long l,r;
int arr[200005];
bool judge(long long mid){
long long c = 0, sum = -1;
for(int i=1;i<=n;i++){
if((sum + arr[i] + 1) > mid){
sum = -1;
c++;
}
sum += arr[i]+1;
}
return c >= m;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>arr[i];
l = max(l,(long long)arr[i]);
r += arr[i];
}
r += n-1;
while(l<r){
long long mid = (l+r)>>1;
if(judge(mid)) l = mid + 1;
else r = mid;
}
cout<<l;
return 0;
}