2021牛客寒假算法基础集训营1

本场难度,略难,主要是难度梯度不均衡外加榜被带歪了。
哈哈,《基础》。
No.721_3
赛提页面
官方题解

F. 对答案一时爽

水,最差一定是0.

const int N = 110;
char a[N],b[N];
 
int main()
{
   //freopen("in.txt","r",stdin);
   //freopen("out.txt","w",stdout);
   IOS;
   int n;
   cin >> n;
   rep(i,1,n) cin >> a[i];
   rep(i,1,n) cin >> b[i];
   int cnt = 0;
   rep(i,1,n)
   {
       if(a[i] == b[i]) cnt += 2;
       else cnt += 1;
   }
   cout << cnt << " " << 0;
}

B. 括号

方法应该有很多种,这题我想了好久。
可能早就可以过的,中间试了很多种构造方法都WA了,最后AC的时候是因为k==0的时候写成了输出’)(’,这里写的是单引号,然后就WA爆了。
后来意识到这点,直接一发过了,所以不知道中间想的几种构造方法能不能过,这里讲我过的这种。
k \sqrt{k} k 个’(’ 加上 k − 1 \sqrt{k}-1 k 1个’)’ 加上 x x x个’(‘加上 y y y个’)’。枚举 y y y,算出 x x x。当括号对的个数等于 k k k并且长度不超过 1 0 5 10^5 105的时候输出并结束程序。
另外这题有两个注意点:
1.要求输出非空
2.要求构造出的长度不超过 1 0 5 10^5 105

int main()
{
   //freopen("in.txt","r",stdin);
   //freopen("out.txt","w",stdout);
   IOS;
   int k;
   cin >> k;
   if(k == 0)
   {
       cout << ")(";
       return 0;
   }
   if(k < 100000)
   {
       cout << "(";
       rep(i,1,k) cout << ")";
       return 0;
   }
   int k1 = (int)(sqrt(k));
   if(k1 * k1 == k)//完全平方数就直接这样一定对
   {
        rep(i,1,k1) cout << '(';
        rep(i,1,k1) cout << ')';
        // cout << "de: " << k1*2 << endl;
        return 0;
   }
   int y = 1;
   while(1)
   {
       int k2 = k - k1 * (k1-1);
       int t = k2 / y;
       int x = t - k1;
       if(k1 * (k1-1) + y * (k1 + x) == k && k1 + k1 -1 + x + y <= 100000)
       {
           rep(i,1,k1) cout << '(';
           rep(i,1,k1-1) cout << ')';
           rep(i,1,x) cout << '(';
           rep(i,1,y) cout << ')';
           return 0;
       }
       y++;
   }
}

I. 限制不互素对的排列

这题感觉是个签到题,榜被带歪了没人搞这个,
这题有个条件让这题变成了sb题,就是 k ≤ n / 2 k\le n/2 kn/2
我们知道长度为 n n n的全排列,本来就有 n / 2 n/2 n/2个偶数,所以最少能组成 n / 2 − 1 n/2-1 n/21个不互质的相邻数对。构造方法就是把偶数提到前边去,偶和奇用1来分界。
又可以利用3这个奇数和6的关系,让数对+1,所以啥时候输出-1直接看下面代码吧。

const int N =1e5+5;
bool vis[N];

int main()
{
   //freopen("in.txt","r",stdin);
   //freopen("out.txt","w",stdout);
   IOS;
   int n,k;
   cin >> n >> k;
   if(k == n / 2)
   {
       if(n < 6) cout << "-1";
       else
       {
           for(int i=2;i<=n;i += 2)
           {
               if(i != 6)
               cout << i << " ";
           }
           cout << 6 << " " << 3 << " ";
           for(int i=1;i<=n;i+=2)
           {
               if(i != 3)
               cout << i << " ";
           }
       }
   }
   else
   {
       int cnt = 0;
       int pos;
       for(int i=2;i<=n&&cnt<=k;i+=2)
       {
           ++cnt;
           cout << i << " ";
           vis[i] = 1;
       }
       rep(i,1,n)
       {
           if(!vis[i]) cout << i << " ";
       }
   }   
}

A. 串

已收入dp文章Day31,此处不再写,附链接.
在Day31

更新中。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值