A
B
C
D
题记:水题,模拟即可。
#include<bits/stdc++.h>
using namespace std;
const int M=1e9+7;
const int N=1e5+10;
int a[5];
char str[105];
int main(){
int n;
cin>>n;
while(n--){
cin>>str;
memset(a,0,sizeof(a));
for(int i=0;i<strlen(str);i++){
if(str[i]=='@'||str[i]=='?'||str[i]=='!')
a[3]++;
else if(str[i]>='0'&&str[i]<='9')
a[2]++;
else
a[1]++;
}
if(a[1]<4)
cout<<"The last character must be a letter."<<endl;
else if(a[2]<4)
cout<<"The last character must be a digit."<<endl;
else if(a[3]<2)
cout<<"The last character must be a symbol."<<endl;
else
cout<<"The last character can be any type."<<endl;
}
return 0;
}
E
题记:这题有点坑…首先字符串不能用字符数组char,要用string。然后累加sum时数会很大,需要长整形。
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
string s;
int scnt[30];
int main()
{
cin>>s;
int maxn=0;
int len=s.length();
for(int i=0;i<len;i++)
{
scnt[s[i]-97]++;
if(maxn<scnt[s[i]-97])
maxn=scnt[s[i]-97];
}
int minn=inf;
int ans=2;
for(int i=2;i<=maxn;i++)
{
long long t=0;
for(int j=0;j<26;j++)
t+=(scnt[j]%i)*(long long )scnt[j];
if(minn>t)
{
minn=t;
ans=i;
}
}
cout<<ans<<endl;
}
F
题记:我作死正常遍历了一遍,果然超时了…用了二分就ac了。
#include<bits/stdc++.h>
using namespace std;
const int M=1e9+7;
const int N=1e5+10;
int a[N];
int main(){
int n,m;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
sort(a,a+n);
int x;
for(int i=0;i<m;i++){
scanf("%d",&x);
int l=0,r=n-1;
while(l<=r){
int mid=l+(r-l)/2;
if(a[mid]<x)
l=mid+1;
else
r=mid-1;
}
if(a[l]>=x)
printf("%d\n",a[l]);
else
printf("Dr. Samer cannot take any offer :(.\n");
}
return 0;
}
G
题记:模拟即可。
#include<bits/stdc++.h>
using namespace std;
const int M=1e9+7;
const int N=1e5+10;
int main(){
int n,m;
cin>>n>>m;
if(m%n==0)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
H
题记:找出数组中每个数之后的比这个数大的数。一开始直接遍历,果不其然TLE了。这题要记录每个数出现的位置和次数,遍历这个数到50每一个数,找出最接近的数输出即可,没有则输出-1.
#include<bits/stdc++.h>
using namespace std;
const int M=1e9+7;
const int N=1e5+10;
const int INF=0x3f3f3f3f;
int a[N];//输入数组
int t[55][N];//记录每个数出现的位置
int k[55];//记录每个数出现的次数
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
t[a[i]][k[a[i]]]=i;//记录这个数第k[i]次出现时的位置
k[a[i]]++;//这个数出现的次数
}
for(int i=0;i<n;i++){//遍历数组中每个数
int sum=INF;
for(int j=a[i]+1;j<=50;j++){//遍历比a[i]大的数
int l=0,r=k[j]-1;
while(l<r){//二分找出最接近a[i]的数
int mid=(l+r)/2;
if(t[j][mid]>i)
r=mid;
else
l=mid+1;
}
if(t[j][r]>i)
sum=min(sum,t[j][r]);//取最接近a[i]的数
}
if(sum==INF)
cout<<"-1"<<" ";
else
cout<<a[sum]<<" ";
}
return 0;
}
I
题记:当i,j相同时,a[i][j]是第i个数的平方。把这个数开平方即可。
#include<bits/stdc++.h>
using namespace std;
const int M=1e9+7;
const int N=1e5+10;
int a[105][105];
int ans[105];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
cout<<pow(a[i][i],0.5)<<" ";
return 0;
}