zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 49 (Rated for Div. 2)

     Educational Codeforces Round 49 (Rated for Div. 2)

    题目链接:https://codeforces.com/contest/1027

    A题题解

    • 题意:根据一个字符串,经过变化后是否能成为一个回文串(变成相邻的字母,a只能变成b,z只能变成x,其他的有两种可能)(都要变)
    • 很简单,只要不满足两个条件比较ASCII码1.相差不为1  2.相差大于2就不行,其他就行
    • AC代码
    • #include<bits/stdc++.h>
      using namespace std;
      typedef long long ll;
      //ll a ,b ,c ,d;
      char a[200];
      const ll inff = 0x3f3f3f3f3f3f3f3fLL; //18
      int main(){
          int n;
          cin >> n;
          while(n --){
              int t;
              cin >> t;
              memset(a,0,sizeof(a));
              cin >> a;
              bool flag = 1;
              if(t % 2 == 0){
                  for(int i = 0 ; i < t; i++){
                      if(a[i] != a[t-i-1]){
                          if(abs(a[i] - a[t-i-1] ) > 2 || abs(a[i] - a[t-i-1] ) == 1 )
                          {
                              flag = 0;
                              break;
                          }
                          //cout << "NO" << endl;
                          
                      
                      }
                  }
              }
              if(!flag) cout << "NO" << endl;
              else cout << "YES" << endl;
          }
      }#include<bits/stdc++.h>
      using namespace std;
      typedef long long ll;
      //ll a ,b ,c ,d;
      char a[200];
      const ll inff = 0x3f3f3f3f3f3f3f3fLL; //18
      int main(){
          int n;
          cin >> n;
          while(n --){
              int t;
              cin >> t;
              memset(a,0,sizeof(a));
              cin >> a;
              bool flag = 1;
              if(t % 2 == 0){
                  for(int i = 0 ; i < t; i++){
                      if(a[i] != a[t-i-1]){
                          if(abs(a[i] - a[t-i-1] ) > 2 || abs(a[i] - a[t-i-1] ) == 1 )
                          {
                              flag = 0;
                              break;
                          }
                          //cout << "NO" << endl;
                          
                      
                      }
                  }
              }
              if(!flag) cout << "NO" << endl;
              else cout << "YES" << endl;
          }
      }
      View Code

    B题题解

    • 题意:在矩阵里面放数,先把横纵坐标之和是偶数的放满,从左往右,从上往下,然后从最小的奇数(横纵坐标之和)开始继续往后放数;直到把n*n这些数放完
    • 数学推公式,ans1 = n * (a - 1) + b + 1; a+b为奇数:ans = ans1 + n * n ; 为偶数 :ans1 ; 然后都 / 2;
    • 可以分类讨论,讨论可以发现共性
    • AC代码
    • #include<bits/stdc++.h>
      using namespace std;
      typedef long long ll;
      //ll a ,b ,c ,d;
      //char a[200];
      const ll inff = 0x3f3f3f3f3f3f3f3fLL; //18
      int main(){
      ll n , t;
      cin >> n >> t;
      ll ans ;
      while(t--){
          ll a , b;
          cin >> a >> b;
          ans = 0;
      
      ans = n * (a - 1) + b + 1;
      if((a + b)%2!=0)
      ans += n * n;
           cout << ans / 2<< endl;
      }
      return 0;
      }
      View Code

    C题题解

    • AC代码
    • #include <cstdio>
      #include <cctype>
      #include <map>
      #define FOR(i,a,b) for(int i=a;i<=b;++i)
      inline char in() {
          static char buf[10001],*p1=buf,*p2=buf;
          return p1==p2&&(p2=(p1=buf)+fread(buf,1,10000,stdin),p1==p2)?EOF:*p1++;
      }
      template <class Tp> void read(register Tp &s) {
          s=0;
          register bool neg=0;
          register char c;
          while(!isdigit(c=in())) if(c=='-') neg=1;
          while(s=(s<<3)+(s<<1)+c-48,isdigit(c=in()));
          s=(neg?-s:s);
      }
      
      int T,n,a[1000005];
      std::map<int,int> cnt;
      int main() {
          for(read(T);T;--T) {
              cnt.clear();
              read(n);
              int t,m=0;
              FOR(i,1,n) read(t),cnt[t]++;
              bool flg=0;
              for(std::map<int,int>::iterator it=cnt.begin();it!=cnt.end();++it) {
                  if((*it).second>=2) a[++m]=(*it).first;
                  if((*it).second>=4) {
                      flg=1;
                      int ans=(*it).first;
                      printf("%d %d %d %d
      ",ans,ans,ans,ans);
                      break;
                  }
              }
              if(flg) continue;
              int x=a[1],y=a[2];
              FOR(i,3,m) if(x*a[i]<a[i-1]*y) x=a[i-1],y=a[i];
              printf("%d %d %d %d
      ",x,x,y,y);
          }
          return 0;
      }
      View Code

     D题题解

    • 题意:一个寝室里有n个房间和一个老鼠,老鼠一开始可能在任意一个房间,老鼠会从房间i跳到a[i]房间,问在哪些房间下陷阱可以用最小的代价抓到老鼠?
    • 分析:遍历所有房间,给从这些可能到达的房间打上标记,每次打标志在花费最小的房间布下陷阱
    • AC代码
      #include<bits/stdc++.h>
      using namespace std;
      typedef long long ll;
      #pragma GCC optimize(2)
      #pragma GCC optimize(3)
      #pragma GCC optimize("Ofast")
      %:pragma GCC optimize("Ofast")
      %:pragma GCC optimize("inline")
      %:pragma GCC optimize("-fgcse")
      %:pragma GCC optimize("-fgcse-lm")
      %:pragma GCC optimize("-fipa-sra")
      %:pragma GCC optimize("-ftree-pre")
      %:pragma GCC optimize("-ftree-vrp")
      %:pragma GCC optimize("-fpeephole2")
      %:pragma GCC optimize("-ffast-math")
      %:pragma GCC optimize("-fsched-spec")
      %:pragma GCC optimize("unroll-loops")
      %:pragma GCC optimize("-falign-jumps")
      %:pragma GCC optimize("-falign-loops")
      %:pragma GCC optimize("-falign-labels")
      %:pragma GCC optimize("-fdevirtualize")
      %:pragma GCC optimize("-fcaller-saves")
      %:pragma GCC optimize("-fcrossjumping")
      %:pragma GCC optimize("-fthread-jumps")
      %:pragma GCC optimize("-funroll-loops")
      %:pragma GCC optimize("-fwhole-program")
      %:pragma GCC optimize("-freorder-blocks")
      %:pragma GCC optimize("-fschedule-insns")
      %:pragma GCC optimize("inline-functions")
      %:pragma GCC optimize("-ftree-tail-merge")
      %:pragma GCC optimize("-fschedule-insns2")
      %:pragma GCC optimize("-fstrict-aliasing")
      %:pragma GCC optimize("-fstrict-overflow")
      %:pragma GCC optimize("-falign-functions")
      %:pragma GCC optimize("-fcse-skip-blocks")
      %:pragma GCC optimize("-fcse-follow-jumps")
      %:pragma GCC optimize("-fsched-interblock")
      %:pragma GCC optimize("-fpartial-inlining")
      %:pragma GCC optimize("no-stack-protector")
      %:pragma GCC optimize("-freorder-functions")
      %:pragma GCC optimize("-findirect-inlining")
      %:pragma GCC optimize("-fhoist-adjacent-loads")
      %:pragma GCC optimize("-frerun-cse-after-loop")
      %:pragma GCC optimize("inline-small-functions")
      %:pragma GCC optimize("-finline-small-functions")
      %:pragma GCC optimize("-ftree-switch-conversion")
      %:pragma GCC optimize("-foptimize-sibling-calls")
      %:pragma GCC optimize("-fexpensive-optimizations")
      %:pragma GCC optimize("-funsafe-loop-optimizations")
      %:pragma GCC optimize("inline-functions-called-once")
      %:pragma GCC optimize("-fdelete-null-pointer-checks")
      # define IOS ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
      ll a[200000+ 10] , c[200000 + 10];
      ll vis[200000 + 10];//记录是否走过 
      int main(){
          IOS;
          ll n;
          ll sum=0 , v;
          cin >> n;
          for(int i = 1 ; i <= n ; i ++){
              cin >> a[i];
          }
          for(int i = 1 ; i <= n ; i ++){
              cin >> c[i];
          }
          ll x;
          for(int i = 1 ;i <= n ; i++){
          x = i;
          while( !vis[x]){
              vis[x] = i;
              x = c[x];
          }
          
          //当有重复时,即已经走过,就没必要再走 
          if(i != vis[x]) continue ;
           v = x;
          ll ans = a[x]; 
          while(v != c[x]) {
              x = c[x];
              ans = min(a[x] ,ans);
          }
      //    cout << ans << endl;
          sum += ans ;
      }
      cout << sum << endl;
      }
      View Code

    顺带提一下,用加速挂真的快了很多,足足快了4倍(可以用scanf,还是用吧),不过强制氧化没什么用,只快1ms,应该是cf已经开了氧化

  • 相关阅读:
    【UVA12093】Protecting Zonk (树形DP)
    【UVA1579】俄罗斯套娃 Matryoshka (动态规划)
    【UVA1371】Period (二分+DP)
    【UVA1379】Pitcher Rotation (贪心+DP)
    【UVA1633】禁止的回文串(状压DP)
    【POJ3358】
    【POJ2773】Happy 2006 欧几里德
    【POJ1284】Primitive Roots 欧拉函数
    【POJ2478】Farey Seque
    【POJ3243】拓展BSGS(附hash版)
  • 原文地址:https://www.cnblogs.com/Agnel-Cynthia/p/10604977.html
Copyright © 2011-2022 走看看