D.
分析:按照题意是求两交替且各自相同的子序列,用vector存每个数出现的不同位置,两个for循环遍历,每次取出i,j,now用于定位当前交替进行位置,x1,x2分别定位i,j,位置。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<vector>
using namespace std;
vector<int>v[105];
int main()
{
int n,m;
int x;
int res=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
v[x].push_back(i);
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
if(i==j)
continue;
int x1=0,x2=0,sum=0,now=0;
while(1)
{
while(x1<v[i].size()&&v[i][x1]<now)//去除多余
x1++;
now=v[i][x1];
if(x1==v[i].size())
break;
sum++;
while(x2<v[j].size()&&v[j][x2]<now)
x2++;
now=v[j][x2];
if(x2==v[j].size())
break;
sum++;
}
res=max(res,sum);
}
}
printf("%d\n",res);
return 0;
}
/*
6 2
1 2 1 2 1 2
*/
F.
分析,难度较低,求一下最大公约数就行
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<string.h>
using namespace std;
int gcd(int a,int b)
{
if(a%b==0)
return b;
else
return gcd(b,a%b);
}
int main()
{
int n,l;
int ant;
scanf("%d",&n);
char a[1010];
int x=0,y=0,z=0,w=0;
// scanf()
scanf("%s",a);
l=strlen(a);
for(int i=0;i<l;i++)
{
if(a[i]=='a')
x++;
else if(a[i]=='v')
y++;
else if(a[i]=='i')
z++;
else if(a[i]=='n')
w++;
}
if(x*y*z*w==0)
printf("0/1\n");
else
{
ant=gcd(l*l*l*l,x*y*z*w);
printf("%d/%d\n",x*y*z*w/ant,l*l*l*l/ant);
}
return 0;
}
G.
分析:真的是难度不够,题意来凑。用map存ai数组存bi,k为每次bi等待的时间,k从0遍历到ai的最大值+1即可
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
const int maxn=1e3+10;
map<int,int>p;
int main()
{
int x;
int ant=0;
int k=0;
bool flag;
int a[maxn];
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&x);
if(x>ant)
ant=x;
p[x]++;
}
for(int i=0;i<m;i++)
scanf("%d",&a[i]);
for(k=0;k<=ant+1;k++)
{
flag=0;
for(int i=0;i<m;i++)
{
if(p[a[i]+k])
{
flag=1;
break;
}
}
if(!flag)
{
printf("%d\n",k);
break;
}
}
return 0;
}
H.可推出 (n+1)/(n*2)取余mod
费马小定理求逆元(快速幂),即可
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll ksm(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1)
res=(res*a+mod)%mod;
a=(a*a+mod)%mod;
b>>=1;
}
return res;
}
int main()
{
ll n;
while(~scanf("%lld",&n))
{
printf("%lld\n",(n+(ll)1)*(ksm(2*n,mod-2)+mod)%mod);
}
return 0;
}
I.难度不大,字符串读入,找出 . 的位置,判断 . 后第三位即可
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<string.h>
using namespace std;
int main()
{
int n,l;
char a[50];
double x=0;
scanf("%d",&n);
while(n--)
{
scanf("%s",a);
l=strlen(a);
for(int i=0;i<l;i++)
{
if(a[i]=='.')
{
if(a[i+3]>='5')
{
x+=(10-(a[i+3]-'0'))*0.001;
}
else
{
x-=(a[i+3]-'0')*0.001;
}
break;
}
}
}
printf("%0.3lf\n",x);
return 0;
}
J.求每个工厂效率的最小公倍数,用最小公倍数除以每个工厂效率后累加和ant,判断总人数是否为ant倍数即可
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int gcd(int a,int b)
{
int t;
if(a<b)
{
t=a;
a=b;
b=t;
}
if(a%b==0)
return b;
else
return gcd(b,a%b);
}
int gce(int a,int b)
{
return (a*b)/gcd(a,b);
}
int main()
{
int n;
ll m;
ll ans=0;
int a[1010];
int b=1;
ll ant=0;
scanf("%d%lld",&n,&m);
// printf("%d %lld",n,m);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
ans+=a[i];
// printf("%d\n",a[i]);
b=gce(b,a[i]);
// printf("b : %d\n",b);
}
for(int i=0;i<n;i++)
{
ant+=b/a[i];
}
if(m%ant!=0)
printf("No\n");
else
{
printf("Yes\n");
for(int i=0;i<n;i++)
{
if(!i)
printf("%lld",(m/ant)*(b/a[i]));
else
printf(" %lld",(m/ant)*(b/a[i]));
}
printf("\n");
}
return 0;
}
K.签到题
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",((a+b)/2)*(a-(a+b)/2));
return 0;
}