选择题+三道编程题,整体难度不高,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; }