A. 水题 去重但是保持原次序
#include<bits/stdc++.h>
using namespace std;
const int maxn=50+5;
int a[maxn],b[maxn];
int main()
{
int n;
scanf("%d",&n);
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int num=0;
for(int i=0;i<n;i++)
{
int k=i;
if(a[i]==-1) continue;
for(int j=0;j<n;j++)
{
if(j==i) continue;
if(a[j]==a[i]) {
a[j]=-1;
k=j;
}
}
b[k]=a[i];
num++;
a[i]=-1;
}
cout<<num<<endl;
for(int i=0;i<n;i++)
{
if(!b[i]||b[i]==-1) continue;
printf("%d%c",b[i],i+1==n?'\n':' ');
}
return 0;
}
B.水题 使用两种方法
//输出最少要删除的字符数 使得原字符串满足条件
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
char s[maxn];
int main()
{
int n,ans=0;
scanf("%d",&n);
scanf("%s",s);
for(int i=0;i<n-2;i++)
{
if(s[i]=='x'&&s[i+1]=='x'&&s[i+2]=='x') ans++;
}
cout<<ans<<endl;
return 0;
}
//输出最少要删除的字符数 使得原字符串满足条件
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
char s[maxn];
int main()
{
int n,ans=0,last;
scanf("%d",&n);
scanf("%s",s);
s[n]='i';
s[n+1]='\0';
bool flag=false;
for(int i=0;i<=n;i++)
{
if(!flag) {
if(s[i]=='x') {
last=i;
flag=true;
}
}
else {
if(s[i]=='x') continue;
ans+=i-last>2?i-last-2:0;
flag=false;
}
}
cout<<ans<<endl;
return 0;
}
C.二分 打表
//确定房间号及次序号
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=2e5+5;
int main()
{
int n,m;
LL sum[maxn];
sum[0]=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
LL k;
scanf("%lld",&k);
sum[i]=sum[i-1]+k;
}
for(int i=0;i<m;i++)
{
LL k;
scanf("%lld",&k);
int p1=lower_bound(sum+1,sum+1+n,k)-sum;
cout<<p1<<" "<<k-sum[p1-1]<<endl;
}
return 0;
}
D.暴力 等差数列通项公式
//如果不可能产生等差数列 输出-1
//暴力枚举公差 公差有5中可能 等差数列首项有3种可能 1.5*1e6的时间复杂度
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
const int INF=0x3f3f3f3f;
int main()
{
int n,a[maxn];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int d=a[1]-a[0],l=d-2,r=d+2,ans=INF;
bool solve=false;
for(int i=l;i<=r;i++)
{
bool flag=true;
int num=0;
for(int j=1;j<n;j++)
{
int k=a[0]+j*i;
if(k==a[j]-1||k==a[j]+1) num++;
else if(k!=a[j]) flag=false;
if(!flag) break;
}
if(flag) {
solve=true;
ans=min(ans,num);
}
}
a[0]++;
for(int i=l;i<=r;i++)
{
bool flag=true;
int num=1;
for(int j=1;j<n;j++)
{
int k=a[0]+j*i;
if(k==a[j]-1||k==a[j]+1) num++;
else if(k!=a[j]) flag=false;
if(!flag) break;
}
if(flag) {
solve=true;
ans=min(ans,num);
}
}
a[0]-=2;
for(int i=l;i<=r;i++)
{
bool flag=true;
int num=1;
for(int j=1;j<n;j++)
{
int k=a[0]+j*i;
if(k==a[j]-1||k==a[j]+1) num++;
else if(k!=a[j]) flag=false;
if(!flag) break;
}
if(flag) {
solve=true;
ans=min(ans,num);
}
}
if(solve) cout<<ans<<endl;
else cout<<"-1"<<endl;
return 0;
}
E.注意边界情况的考虑
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int main()
{
int n,w,res=0,ans=-INF,l=0;
scanf("%d%d",&n,&w);
for(int i=0;i<n;i++)
{
int k;
scanf("%d",&k);
res+=k;
if(res<0) l=max(l,abs(res));
else ans=max(ans,res);
}
if(l>w||ans>w||w-ans<l) cout<<"0"<<endl;
else if(ans==-INF) cout<<w-l+1<<endl;
else cout<<w-ans-l+1<<endl;
return 0;
}
F.二分 打表
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int main()
{
int n,k,a[maxn],b[maxn],done[maxn];
memset(done,0,sizeof(done));
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
memcpy(b,a,sizeof(a));
sort(b,b+n);
for(int i=0;i<k;i++)
{
int u,v;
scanf("%d%d",&u,&v);
if(a[u-1]>a[v-1]) done[u-1]--;
else if(a[u-1]<a[v-1]) done[v-1]--;
}
for(int i=0;i<n;i++)
{
int p=lower_bound(b,b+n,a[i])-b;
cout<<p+done[i]<<" ";
}
cout<<endl;
return 0;
}