1.牛牛的数列( 牛牛的数列 (nowcoder.com) )
首先将数列分成若干个严格上升的子序列,然后判断序列是否可以合并
#include<bits/stdc++.h>
using namespace std;
int a[100010];
vector < pair<int,int> > b;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,l=0,r=0,maxn=0;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=1;i<n;i++){
if(a[i]>a[i-1])r++;
else{
b.push_back({l,r});
r=l=i;
}
}
b.push_back({l,r});
cout<<b.size()<<endl;
for(int i=1;i<b.size();i++){
//相邻区间合并(后一个区间长大于1)
if(b[i].second>b[i].first && a[b[i].first+1]-a[b[i-1].second]>1)
maxn=max(maxn,b[i].second-b[i-1].first+1);
//间隔区间和并
if(b[i].second==b[i].first && a[b[i+1].first]-a[b[i-1].second]>1)
maxn=max(maxn,b[i+1].second-b[i-1].first+1);
//不合并区间(原区间长+1) !!! 有可能整个区间都递增,这里直接加1,最后取min(maxn,n)
maxn=max(maxn,b[i].second-b[i].first+1+1);
}
//排除序列长为1的情况
if(n==1)cout<<"1";
else cout<<;
return 0;
}
2.Kabayashi And Three consciousness
#include<iostream>
#define ll long long
using namespace std;
ll gcd(ll a,ll b){return !b ? a : gcd(b,a%b);}
ll a[100000];
int main(){
ll p,q,cnt=0;
cin>>p>>q;
while(p!=1){
a[cnt++]=p/q;
p%=q;
ll x=gcd(p,q);
p/=x; q/=x;
swap(p,q);
}
cout<<cnt<<endl;
for(int i=0;i<cnt;i++)cout<<a[i]<<' ';
return 0;
}
3.P1071 [NOIP2009 提高组] 潜伏者
简单模拟即可
#include<bits/stdc++.h>
#define ll long long
using namespace std;
char dict[26];
int main(){
string s1,s2,s;
bool check=true;
cin>>s1>>s2>>s;
for(int i=0;i<s1.size();i++){
if(dict[s1[i]-'A']==0)dict[s1[i]-'A']=s2[i];
if(dict[s1[i]-'A']!=s2[i])check=false;
}
for(int i=0;i<26;i++)if(dict[i]==0)check=0;
for(int i=0;i<25;i++){
for(int j=i+1;j<26;j++)
if(dict[i]==dict[j])check=0;
}
if(check){
for(int i=0;i<s.size();i++)
cout<<dict[s[i]-'A'];
}
else cout<<"Failed";
return 0;
}
4.大吉大利,今晚吃鸡
设所求为f(n),考虑f(n+1),
将A上除最大的都移动到C-----f(n)
将最大盘移动到B-----1
将C上除最大的都移动到A-----f(n)
将最大盘移动到C-----1
将A上除最大的都移动到C-----f(n)
f(n+1)=3*f(n)+2
f(n)=
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
int main(){
while(cin>>n){
cout<<(ll)(pow(3,n)-1)<<endl;
}
return 0;
}
5.这河里吗?
题目大意就是检验一个数独是否正确
然后分3步,分别检查行,列,3*3
下面给出C代码(跟C++差不多,熟悉一下C,好久没码过了)
#include<stdio.h>
#include<string.h>
int shudu[10][10];
struct {
int x,y;
}a[9]={{1,1},{1,4},{1,7},{4,1},{4,4},{4,7},{7,1},{7,4},{7,7}};
int ar[10];
int main(){
int check=1;
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
scanf("%d",&shudu[i][j]);
//检查行
for(int i=1;i<=9;i++){
memset(ar,0,sizeof ar);
for(int j=1;j<=9;j++)
ar[shudu[i][j]]=1;
for(int r=1;r<=9;r++)
if(ar[r]==0)check=0;
}
//检查列
for(int j=1;j<=9;j++){
memset(ar,0,sizeof ar);
for(int i=1;i<=9;i++)
ar[shudu[i][j]]=1;
for(int r=1;r<=9;r++)
if(ar[r]==0)check=0;
}
//检查3*3
for(int i=0;i<9;i++){
memset(ar,0,sizeof ar);
int m=a[i].x,n=a[i].y;
for(int j=0;j<3;j++){
for(int k=0;k<3;k++){
ar[shudu[m+j][n+k]]=1;
}
}
for(int r=1;r<=9;r++)
if(ar[r]==0)check=0;
}
if(check)printf("YES");
else printf("NO");
return 0;
}