新生周赛2019/11/23题解
A Fenoix超厌恶xxx
简单题:
题意:一个字符串中不能出现三个x,出现则要删除一个,如果都没有则输出0,否则,打印删除的次数。
按题意枚举即可,只要连续出现三个x,那么就删除一个,删除次数即答案。
#include <bits/stdc++.h>
using namespace std;
const int MM=1e6+5;
char s[MM];
int main()
{
int t;
cin>>t;
cin>>s;
int len=strlen(s);
int sum=0;
for(int i=0; i<len; i++)
{
if(s[i]=='x'&&s[i+1]=='x'&&s[i+2]=='x')
{
sum++;
}
}
cout<<sum;
return 0;
}
B 来呀,贪心呀~
原题
LJN学长就是考查你们学过的知识是否会,做过的题目是否都能做出了来。
做不出来就该反思一下自己。
C Fenoix的趣事
难度:简单
题意:两个队伍,分别代表为0,1,不能出现有七个或者七个以上的人占在一起。
枚举即可。
出现连续0或者1超过大于等于7即为NO,否则为YES。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string z_o;
int Count, length, Max;
char cur;
cin >> z_o;
length = z_o.size();
cur = z_o[0];
Max = Count = 1;
for(int i = 1; i < length; i++)
{
if(z_o[i] == cur)
Count++;
else
{
cur = z_o[i];
Count = 1;
}
if(Count > Max)
Max = Count;
}
if(Max >= 7)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
也可以这样写
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int M=1e3+5;
char p[M];
int main ()
{
scanf("%s",p);
int i,n,flag=0;
n=strlen(p);
for(i=6; i<n; i++)
{
if((p[i]=='0'&&p[i-1]=='0'&&p[i-2]=='0'&&p[i-3]=='0'&&p[i-4]=='0'&&p[i-5]=='0'&&p[i-6]=='0')
||(p[i]=='1'&&p[i-1]=='1'&&p[i-2]=='1'&&p[i-3]=='1'&&p[i-4]=='1'&&p[i-5]=='1'&&p[i-6]=='1'))
{
flag=1;
break;
}
}
if(flag==0)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
return 0;
}
D lwm学姐的木屋
难度:中等
思路题
解题思路:将木板从大到小排序后粘在一起的取大的矩阵。
#include <bits/stdc++.h>
using namespace std;
int a[1005];
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int k;
cin>>k;
while(k--)
{
int n;
cin>>n;
int i,sum=0;
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n,cmp);
for(i=0; i<n; i++)
{
if(sum<a[i])
{
sum++;
}
else
{
break;
}
}
cout<<sum<<endl;
}
return 0;
}
也可以这样写
#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
int k;
cin>>k;
while(k--)
{
int n,i,temp=1;
cin>>n;
for(i=1; i<=n; i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
int t=1;
for(i=n; i>=1; i--)
{
if(a[i]/t>0)
{
temp=t;
t++;
}
else
break;
}
cout<<temp<<endl;
}
return 0;
}
E Fenoix的针对
难度:偏难
题意:按要求打印
规律简单,一看就懂。
找出规律,模拟即可
//right
//down
//left
//down
//right
//up
#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=1e2+5;
int p[N][N];
void PrintMatrix(int y)
{
int row=2, colum=2,n=1;
int i=1, j=0;
int ix;
while (1)
{
//right
while(j<colum)
p[i][++j]=n++;
colum++;
//down
while(i<row)
p[++i][j] = n++;
row++;
//left
while(j>1)
p[i][--j] = n++;
if (row > y)
break;
//down
while(i<row)
p[++i][j] = n++;
row++;
//right
while(j<colum)
p[i][++j] = n++;
colum++;
//up
while(i>1)
p[--i][j] = n++;
if (colum > y)
break;
}
for (i=1; i<=y; i++)
{
for (j=1; j<=y; j++)
printf("%2d ", p[i][j]);
printf("\n");
}
}
int main()
{
int s;
while(cin>>s){
//mem(p,0);
PrintMatrix(s);
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[110][110],n,i,j,z;
while(cin>>n)
{
a[0][0]=1;
for(i=1; i<n; i++)
a[i][i]=a[i-1][i-1]+2*i;
for(z=1; z<n; z++)
{
int t=z,t1=z;
if(z%2==1)
{
while(t--)
{
a[t][t1]=a[t+1][t1]-1;
a[t1][t]=a[t1][t+1]+1;
}
}
else
{
while(t--)
{
a[t][t1]=a[t+1][t1]+1;
a[t1][t]=a[t1][t+1]-1;
}
}
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("%2d ", a[i][j]);
}
cout<<endl;
}
cout<<endl;
}
return 0;
}
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int p[105][105];
int main ()
{
int n;
while(~scanf("%d",&n))
{
int bu =0;
int i,j,l,sum,flag=1;
p[0][0]=1;
bu=1;
for(sum=0; sum<n/2; sum++)
{
for(i=0,j=2*sum+1; j<2*sum+2; j++)
{
bu++;
p[i][j]=bu;
if(bu==n*n)
{
flag=0;
break;
}
}
if(flag==0)
break;
for(j=2*sum+1,i=1; i<2*sum+1; i++)
{
bu++;
p[i][j]=bu;
if(bu==n*n)
{
flag=0;
break;
}
}
if(flag==0)
break;
for(i=1+sum*2,j=2*sum+1; j>=0; j--)
{
bu++;
p[i][j]=bu;
if(bu==n*n)
{
flag=0;
break;
}
}
if(flag==0)
break;
for(j=0,i=2*sum+2; j<2*sum+3; j++)
{
bu++;
p[i][j]=bu;
if(bu==n*n)
{
flag=0;
break;
}
}
if(flag==0)
break;
for(i=2*sum+1,j=2*sum+2; i>=0; i--)
{
bu++;
p[i][j]=bu;
if(bu==n*n)
{
flag=0;
break;
}
}
if(flag==0)
break;
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("%2d ",p[i][j]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
F 说是栈你会做么?
难度:中等偏难
造数据时造水了,很多人不太理解就过了。这题是栈知识考察。
题意
将ab串插入一个空串中,之后每次都是插入可以插人到任意一个位置。每次得到得到的结果都是好串。
#include <bits/stdc++.h>
using namespace std;
#define maxx 55
stack <int> st;
string s;
int main(void)
{
while(cin>>s)
{
while(!st.empty())
{
st.pop();
}
for(int i=0; i<s.length(); i++)
{
//cout<<s[i]<<endl;
if(!st.empty()&&st.top()=='a'&&s[i]=='b')
{
st.pop();
}
else
st.push(s[i]);
}
if(st.empty())
cout<<"Good"<<endl;
else
cout<<"Bad"<<endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
stack<char> s;
int main()
{
char a[60];
cin>>a;
int len;
len=strlen(a);
for(int i=0; i<len; i++)
{
if(s.size()!=0&&s.top()=='a'&&a[i]=='b')
s.pop();
else
s.push(a[i]);
}
if(s.size()==0)
cout<<"Good"<<endl;
else
cout<<"Bad"<<endl;
return 0;
}
也可以用数组模拟
#include <bits/stdc++.h>
using namespace std;
char s[100005];
int main()
{
scanf("%s",s);
int k=strlen(s),i;
for (i=0;i<k;i++)
{
if (s[i]=='b')
break;
if (s[i]=='a')
{
if (s[i+1]=='b')
{
i=i+1;
}
else
if(s[k-1]=='b')
{
k--;
}
else
break;
}
}
if (i==k)
printf("Good");
else
printf("Bad");
return 0;
}
G cgy学长爱吃糖果
难度:偏难
思路题
如果总和为奇数,必定不可能构造。
否则总和为偶数,如果存在最大值>总和-最大值,那么必定无解 否则必定有解,解的构造方法是每次取次大的两个值每次减一即可。
#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
using namespace std;
const int MM=1e5+6;
ll a[MM];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
mem(a,0);
ll sum=0;
int maxx=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
if(maxx<a[i])
maxx=a[i];
}
if(sum%2==0&&sum-maxx>=maxx)
cout<<"NICE!!!"<<endl;
else
cout<<"****!!!"<<endl;
}
return 0;
}
H 我太难了
难度:简单
求阶乘
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll yy(int x)
{
ll sum=1;
for(int i=1;i<=x;i++)
{
sum*=i;
}
return sum;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
cout<<yy(n)<<endl;
}
return 0;
}
I 我也太难了
难度:简单
斐波那契数列,找出第k个斐波那契数。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int MM=1e5+6;
ll a[MM];
void yy()
{
a[1]=1;
a[2]=1;
for(int i=3;i<=150;i++)
{
a[i]=a[i-1]+a[i-2];
}
}
int main()
{
int t;
cin>>t;
yy();
while(t--)
{
int n;
cin>>n;
cout<<a[n]<<endl;
}
return 0;
}
J 来***oix的刁难
难度 中等
从右 到左枚举一下,把第一次出现的树标记一下,再从左到右输出。
#include <bits/stdc++.h>
using namespace std;
const int MM=1e6+5;
int s[MM];
int b[MM];
int main()
{
int t;
scanf("%d",&t);
int sum=0;
for(int i=0; i<t; i++)
{
scanf("%d",s+i);
}
for(int i=t-1;i>=0;i--)
{
for(int j=i-1;j>=0;j--)
{
if(s[i]==s[j])
{
s[j]=0;
}
}
}
int yy=0;
for(int i=0;i<t;i++)
{
if(s[i]!=0){
sum++;
b[yy++]=s[i];
}
}
printf("%d\n",sum);
for(int i=0; i<sum; i++)
{
cout<<b[i]<<" ";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,a[100];
cin>>n;
for(int i=0; i<n; i++)
cin>>a[i];
for(int i=n-1; i>=0; i--)
{
if(a[i]==0)
continue;
for(int j=i-1; j>=0; j--)
{
if (a[j]!=0&&a[i]==a[j])
a[j]=0;
}
}
int sum=0;
for(int i=0; i<n; i++)
if(a[i]!=0)
sum++;
cout<<sum<<endl;
for(int i=0; i<n; i++)
if(a[i]!=0)
{
cout<<a[i]<<' ';
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int s[10005];
int ss[10005];
int main()
{
int a,ans=1,k;
scanf("%d",&a);
for (int i=1; i<=a; i++)
{
scanf("%d",&s[i]);
}
for (int j=a; j>=1; j--)
{
for (k=1; k<=ans; k++)
if (s[j]==ss[k])
break;
if (k==ans+1)
{
ss[ans+1]=s[j];
ans++;
}
}
printf("%d\n",ans-1);
for (int g=ans; g>1; g--)
printf("%d ",ss[g]);
return 0;
}
K Fenoix的签到题
难度:简单
找出最长连续的递增序列
枚举即可。
#include <bits/stdc++.h>
using namespace std;
#define meme(a,b) memset(a,b,sizeof(a))
const int MM=1e5+5;
int a[MM];
int t;
int main()
{
cin>>t;
for(int i=0; i<t; i++)
cin>>a[i];
int sum=a[0];
int maxx=0;
int ans=1;
for(int i=1; i<t; i++)
{
if(a[i]>sum)
{
ans++;
}
else
{
ans=1;
}
if(maxx<=ans)
maxx=ans;
sum=a[i];
}
cout<<maxx<<endl;
return 0;
}
L 防AK题目——超难系列
签到题
直接打印即可