A. Remove a Progression
签到题,易知删去的为奇数,剩下的是正偶数数列。
#include<iostream>
using namespace std;
int T;
int n,x;
int main(){
cin>>T;
while(T--){
cin>>n>>x;
cout<<x * 2<<endl;
}
return 0;
}
B. Yet Another Crosses Problem
n*m存在上界,以一维数组储存二维数组。统计各个行(列)的白块数量,找出其中数量最少的行(列)(注:不一定只有一行(列)的白块最少)。输出结果为最小行数与最小列数之和。
仍遍历满足上述条件的行和列的交点,若其为白块,则输出结果需减去重复点。
#include<iostream>
#include<algorithm>
using namespace std;
const int L = 400000+500;
int q,n,m;
char M[L];
int ans;
int NN[L],NM[L];
int f(){
for(int i =0;i<n;++i) NN[i] = 0;
for(int i = 0;i<m;++i) NM[i] = 0;
for(int i = 0;i<n;++i)
for(int j = 0;j<m;++j)
if(M[i*m+j] == '.') NN[i]++;
for(int j = 0;j<m;++j)
for(int i = 0;i<n;++i)
if(M[i*m+j] == '.') NM[j]++;
int minn = NN[0];
int minm = NM[0];
for(int i =0;i<n;++i) minn = min(minn,NN[i]);
for(int i =0;i<m;++i) minm = min(minm,NM[i]);
int ans = minn + minm;
for(int i = 0;i<n;++i)
for(int j = 0;j<m;++j)
if(NN[i] == minn&&NM[j] == minm)
if(M[i*m+j] == '.') return ans-1;
return ans;
}
int main(){
cin>>q;
while(q--){
cin>>n>>m;
for(int i =0;i<n;++i)
cin>>(M + i*m);
ans = f();
cout<<ans<<endl;
}
return 0;
}
C. From S To T
通过判断串s 是否由串t 退化而来,初步确定答案。
之后判断串t 删去与串s 对应的字符后是否可以由串p 的元素所构成。
#include<iostream> #include<algorithm> #include<cstring> #include<queue> using namespace std; const int L = 100+10; int q; char s[L],t[L],p[L]; int T[L]; int al[28]; int main(){ cin>>q; while(q--){ cin>>s>>t>>p; bool ans = true; for(int i =0;i<27;++i) al[i] = 0; for(int i =0;i<L;++i) T[i] = 0; for(int i =0;p[i]!='