总结:5.11晚VP一场,总体不错,很快AC了AB两题,C题差一点可以过,就是不知道问题出在哪。。。
A. Politics
思路:也算是思维题吧,因为最后自己要留下,而且和自己不同的都要离开,所以就可以转化成计算和自己完全相同的个数(自己包含在内)
AC代码:
#include<iostream>
using namespace std;
const int N=105;
string s[N];
int main(){
int T,n,k,ans;
cin>>T;
while(T--){
ans=1;
cin>>n>>k;
cin>>s[1];
for(int i=2;i<=n;i++){
cin>>s[i];
for(int j=0;j<k;j++){
if(s[1][j]!=s[i][j]){
break;
}
if(j==k-1){
ans++;
}
}
}
cout<<ans<<'\n';
}
return 0;
}
B. Indivisible
思路:也算是思维题吧,找个规律,纯纯的找规律,虽然我也不知道我这样做的理由在哪,但他就是对了,就是除1之外的奇数个数均不能满足,输出-1,偶数均按2 1 4 3 6 5...的规律输出,即i+1 i-1 i+1 i-1...
AC代码:
#include<iostream>
using namespace std;
int main(){
int T,n;
cin>>T;
while(T--){
cin>>n;
if(n==1){
cout<<1<<'\n';
}else{
if(n%2){
cout<<-1<<'\n';
}else{
for(int i=1;i<=n;i++){
if(i%2){
cout<<i+1<<' ';
}else{
cout<<i-1<<' ';
}
}
cout<<'\n';
}
}
}
return 0;
}
C. Almost Increasing Subsequence
开始看着这道题时确实有点懵,但后来便反应过来用前缀和来解决,但我写的代码始终有问题,WA3,不知道错在哪
思路:使用前缀和记录不满足条件的数目,每次询问用区间内数的总数减去不满足条件的个数,但是r-l+1-sum[r]+sum[l+1]这个始终不是太理解。。。
AC代码:
#include<iostream>
using namespace std;
const int N=200005;
int a[N],sum[N];
int main(){
int n,q,l,r;
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-1];
if(i>=3&&a[i-2]>=a[i-1]&&a[i-1]>=a[i]){
sum[i]++;
}
}
// for(int i=1;i<=n;i++){
// cout<<sum[i]<<' '<<'\n';
// }
while(q--){
cin>>l>>r;
if(l==r){
cout<<1<<'\n';
}else{
cout<<r-l+1-sum[r]+sum[l+1]<<'\n';
}
}
return 0;
}
WA代码:(不理解!!!为什么!!!为什么!!!!!)
#include<iostream>
using namespace std;
const int N=200005;
int a[N],sum[N];
int main(){
int n,q,ans=0,l,r;
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
ans++;
if(i>=3&&a[i-2]>=a[i-1]&&a[i-1]>=a[i]){
a[i]=a[i-1];
a[i-1]=a[i-2];
ans--;
}
sum[i]=ans;
}
while(q--){
cin>>l>>r;
if(r-l==0){
cout<<1<<'\n';
}else{
cout<<max(2,sum[r]-sum[l-1])<<'\n';
}
}
return 0;
}