京东8.12AK C++卷
选择题+三道编程题,整体难度不高,8000hc,东子也可以冲了
第一题思路:上界为n/2,然后暴力就好了
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#define ll long long
using namespace std;
string solve(string str,int num){
if(num==0)return str;
string str1=str.substr(0,num);
string str2=str.substr(num,str.length()-num);
string str3=str2+str1;
return str3;
}
int judge(string str){
int len=str.length();
int num=0;
for(int i=0;i<len;i++){
if(str[i]!=str[len-i-1]){
num++;
}
}
return num/2;
}
int main(){
string str;
int n;
cin>>n;
cin>>str;
int len=n/2;
int ans=n/2;
for(int i=0;i<=len;i++){
string str_temp=solve(str,i);
int num=judge(str_temp);
ans=min(ans,num+i);
// cout<<str_temp<<endl;
}
cout<<ans<<endl;
}
第二题思路:滚动数组的思想更新状态即可,卡点为当n为1,但输入大于9时,输出全为0
#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <cmath>
#include <algorithm>
#include <stack>
#define ll long long
using namespace std;
const ll mod = 1e9+7;
ll dp[10];
ll last[10];
stack<int>st;
int main(){
memset(dp,0,sizeof(dp));
memset(last,0,sizeof(last));
int n;cin>>n;
ll tar;
for(int i=1;i<=n;i++){
ll w;cin>>w;
if(n==1)tar=w;
w=w%10;
st.push(w);
}
if(n==1){
int val=tar;
for(int i=0;i<10;i++){
if(i==val){
cout<<1<<' ';
}else{
cout<<0<<' ';
}
}
cout<<endl;
}
else{
int u=st.top();st.pop();
int v=st.top();st.pop();
int x=(u*v)%10;
int y=(u+v)%10;
dp[x]++;dp[y]++;
for(int i=0;i<10;i++){
last[i]=dp[i];
}
while(!st.empty()){
memset(dp,0,sizeof(dp));
int w=st.top();st.pop();
for(int i=0;i<10;i++){
if(last[i]!=0){
int xx=(i+w)%10;
int yy=(i*w)%10;
dp[xx]=(dp[xx]+last[i])%mod;
dp[yy]=(dp[yy]+last[i])%mod;
}
}
for(int i=0;i<10;i++){
last[i]=dp[i];
}
}
for(int i=0;i<10;i++){
cout<<last[i]<<' ';
}cout<<endl;
}
}
第三题思路:分开判断摆正的正方形和斜的正方形即可
#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#define ll long long
using namespace std;
const int N = 55;
int n,m;
string mapInfo[N];
ll allsum;
bool islegal(int x,int y){
if(x<0||x>n||y<0||y>m||mapInfo[x][y]!='X')return false;
else return true;
}
void judge(int x,int y){
int xx,yy;
xx=x;
yy=y;
for(int i=1;i<=max(m,n);i++){
xx=x+i;
yy=y+i;
if(islegal(xx,yy)==false)continue;
xx=x;
yy=y+i;
if(islegal(xx,yy)==false)continue;
xx=x+i;
yy=y;
if(islegal(xx,yy)==false)continue;
allsum++;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
xx=x;yy=y;
if(i==0&&j==0)continue;
// if(x==0&&y==1&&i==1&&j==1)cout<<xx<<' '<<yy<<' '<<mapInfo[xx][yy]<<endl;
xx=xx+i;
yy=yy+j;
// if(x==0&&y==1&&i==1&&j==1)cout<<xx<<' '<<yy<<' '<<mapInfo[xx][yy]<<endl;
if(islegal(xx,yy)==false)continue;
xx=xx+j;
yy=yy-i;
// if(x==0&&y==1&&i==1&&j==1)cout<<xx<<' '<<yy<<' '<<mapInfo[xx][yy]<<endl;
if(islegal(xx,yy)==false)continue;
xx=xx-i;
yy=yy-j;
// if(x==0&&y==1&&i==1&&j==1)cout<<xx<<' '<<yy<<' '<<mapInfo[xx][yy]<<endl;
// cout<<"==========="<<endl;
if(islegal(xx,yy)==false)continue;
xx=xx-j;
yy=yy+i;
if(islegal(xx,yy)==false)continue;
allsum++;
// cout<<x<<' '<<y<<' '<<i<<' '<<j<<endl;
}
}
}
int main(){
allsum=0;
cin>>n>>m;
for(int i=0;i<n;i++)cin>>mapInfo[i];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mapInfo[i][j]=='X'){
judge(i,j);
}
}
}
// ll ans=allsum/4;
cout<<allsum<<endl;
}
基恩士成长空间 421人发布