• 牛客小白月赛59


    比赛链接:https://ac.nowcoder.com/acm/contest/43844

    A:我会开摆

    思路:暴力枚举。我们只需要枚举这个点位的周围位置是否等于自己本身即可

    代码:

    1. #include
    2. #define int long long
    3. using namespace std;
    4. const int N=10;
    5. char a[N][N];
    6. inline void solve(){
    7. for(int i=1;i<=4;i++)
    8. for(int j=1;j<=4;j++)
    9. cin>>a[i][j];
    10. bool ok=false;
    11. for(int i=1;i<=3;i++)
    12. for(int j=1;j<=3;j++)
    13. if(a[i][j]==a[i][j+1]&&a[i][j]==a[i+1][j+1]&&a[i][j]==a[i+1][j])
    14. ok=true;
    15. if(ok) cout<<"Yes\n";
    16. else cout<<"No\n";
    17. }
    18. signed main(){
    19. int T;cin>>T;
    20. while(T--) solve();
    21. }

    B: 走廊的灯

    思路:根据题意发现,第一种情况是字符串中不存在'1'的情况,第二种情况是字符串中不存在'0'的情况。所以直接暴力枚举统计两种情况的最大值,最终取最大值即可。

    代码:

    1. #include
    2. using namespace std;
    3. const int N=2e5+10;
    4. char s[N];
    5. inline void solve(){
    6. int n;cin>>n>>s+1;
    7. int res=0,cnt=0;
    8. for(int i=1;i<=n;i++){
    9. if(s[i]=='1') cnt=0;
    10. else cnt++,res=max(res,cnt);
    11. }
    12. cnt=0;
    13. for(int i=1;i<=n;i++){
    14. if(s[i]=='0') cnt=0;
    15. else cnt++,res=max(res,cnt);
    16. }
    17. cout<"\n";
    18. }
    19. int main(){
    20. int T;cin>>T;
    21. while(T--) solve();
    22. }

    C:输出练习

    思路:这里选择用set容器进行存放数据。存放符合条件的数据,最后输出即可。

    代码:

    1. #include
    2. #define int long long
    3. using namespace std;
    4. int val=9223372036854775807;//2^64-1
    5. int l,r,k;
    6. inline void solve(){
    7. set<int>res;
    8. cin>>l>>r>>k;
    9. int t=1;
    10. if(l<=t and t<=r) res.insert(t);
    11. for(int i=1;i<64;i++){
    12. if(k==0 or t<=val/k){
    13. t*=k;
    14. if(l<=t and r>=t) res.insert(t);
    15. }
    16. else break;
    17. }
    18. if(res.size()){
    19. for(auto x:res) cout<" ";
    20. }
    21. else cout<<"None.";
    22. cout<<"\n";
    23. }
    24. signed main(){
    25. int T;cin>>T;
    26. while(T--) solve();
    27. }

    D:国际象棋

    思路:模拟。对每一次落棋进行判断,如果达到连棋子数,输出棋子数。否则再判断下次落棋。

    代码:

    1. #include
    2. using namespace std;
    3. const int N = 1e3+10;
    4. int board[N][N]; // 0--空白格 1--黑棋子 2--白棋子
    5. int cnt[N];
    6. int n,m,k,t;
    7. bool pd(int row,int col){//判断连棋子数
    8. int type=board[row][col];
    9. // up & down
    10. {
    11. int num1=0,num2=0;//num1:上边 num2:下边
    12. int i=row;
    13. while(i>=1&&board[i][col]==type) i--,num1++;
    14. i=row;
    15. while(i<=n&&board[i][col]==type) i++,num2++;
    16. if(num1+num2-1>=k) return true;
    17. }
    18. // left & right
    19. {
    20. int num1=0,num2=0;//num1:左边 num2:右边
    21. int i=col;
    22. while(i>=1&&board[row][i]==type) i--,num1++;
    23. i=col;
    24. while(i<=m&&board[row][i]==type) i++,num2++;
    25. if(num1+num2-1>=k) return true;
    26. }
    27. // (\)斜边
    28. {
    29. int num1=0,num2=0;//num1:左上 num2:右下
    30. int i=row,j=col;
    31. while(i>=1&&i<=n&&j>=1&&j<=m&&board[i][j]==type) i--,j--,num1++;
    32. i=row,j=col;
    33. while(i>=1&&i<=n&&j>=1&&j<=m&&board[i][j]==type) i++,j++,num2++;
    34. if(num1+num2-1>=k) return true;
    35. }
    36. //(/)斜边
    37. {
    38. int num1=0,num2=0;//num1:右上 num2:左下
    39. int i=row,j=col;
    40. while(i>=1&&i<=n&&j>=1&&j<=m&&board[i][j]==type) i--,j++,num1++;
    41. i=row,j=col;
    42. while(i>=1&&i<=n&&j>=1&&j<=m&&board[i][j]==type) i++,j--,num2++;
    43. if(num1+num2-1>=k) return true;
    44. }
    45. return false;
    46. }
    47. int main(){
    48. cin>>n>>m>>k>>t;
    49. for(int i=1;i<=t;i++){
    50. int col;cin>>col;
    51. int type;
    52. if(i&1) type=1;
    53. else type=2;
    54. int row=++cnt[col];//判断某列上第i行的棋子
    55. board[row][col]=type;
    56. if(pd(row,col)) {
    57. cout<
    58. return 0;
    59. }
    60. }
    61. }

    E:弹珠碰撞

    思路:经典模型:《碰撞==穿过》

     我们发现:这里的碰撞就可以理解为穿过,题意所说:碰撞后会停止一秒,那么这里可以理解为,穿过后增加一秒。

    所以这个题,我们也是同样的处理方式。

    至于停顿时间,例如下图绿球,停顿的时间等于右边红球的数量。

    代码:

    1. #include
    2. #define int long long
    3. using namespace std;
    4. const int N=2e6+10;
    5. int n,m;
    6. int d[N],p[N],dir[N];//dir:代表方向
    7. inline void solve(){
    8. cin>>n>>m;
    9. for(int i=1;i<=m;i++) cin>>d[i];
    10. for(int i=1;i<=m;i++) cin>>p[i],dir[p[i]]=d[i]+1;//使1代表左边,2代表右边
    11. // 1 <------- 2 ------->
    12. int l=0,r=0,ans=0;
    13. for(int i=1;i<=n;i++){
    14. if(dir[i]==0) continue;
    15. if(dir[i]==1) ans=max(ans,i+r);// <---------向左
    16. else r++;
    17. }
    18. for(int i=n;i>=1;i--){
    19. if(dir[i]==0) continue;
    20. if(dir[i]==2) ans=max(ans,n-i+1+l);// ------->向右
    21. else l++;
    22. }
    23. cout<"\n";
    24. }
    25. signed main(){
    26. solve();
    27. }

    对于这道题的更好解释,可以看ygg的blog:https://zhuanlan.zhihu.com/p/578344284

    F: 困难卷积

    思路:这里有个 trick

    若 ∑a=n ,则数组 a 中不同的不超过 sqrt(n) 个。因为1+2+3+..=n,相加的个数不会超过sqrt(n)个。(就不证明了)

    题目有个限制: ∑ai,∑bi<=1e7。根据结论:∑ai,∑bi的时间复杂度为sqrt(1e7) x sqrt(1e7)=1e6,所以暴力并不会TLE。直接暴力即可。

    代码:

    1. #include
    2. #define int long long
    3. using namespace std;
    4. const int N=2e6+10;
    5. int n;
    6. int a[N],b[N];
    7. map<int,int>mp1,mp2;
    8. inline void solve(){
    9. cin>>n;
    10. for(int i=1;i<=n;i++) cin>>a[i],mp1[a[i]]++;
    11. for(int i=1;i<=n;i++) cin>>b[i],mp2[b[i]]++;
    12. int ans=0;
    13. for(auto[lx,ly]:mp1){
    14. for(auto[rx,ry]:mp2){
    15. ans+=(int)(sqrt(abs(lx-rx)))*ly*ry;
    16. }
    17. }
    18. cout<"\n";
    19. }
    20. signed main(){
    21. solve();
    22. }

  • 相关阅读:
    TDengine 时序性数据库为什么海量数据下不卡顿呢
    Linux系统安全配置
    关于尚硅谷禹神Vue视频四十二级v-cloak,delay_server服务器服务器的替代方案
    .NET周报 【3月第2期 2023-03-12】
    日本IT行业现状 日本IT的优缺点
    java计算机毕业设计客户关系智能管理系统MyBatis+系统+LW文档+源码+调试部署
    open SUSE 安装Vmware Workstation Pro 17
    小型k8s
    Unity与安卓交互 | Unity2019.3版本之后,在Android Studio中写代码导出aar包与Unity中使用交互的方法
    C语言考试题库之单选题
  • 原文地址:https://blog.csdn.net/YuDuna/article/details/127696957