Educational Codeforces Round 100 (Rated for Div. 2)

100EDU祭

本文状态:更新中

今天太晚,大致题意明天再补,这里先说做法。
本场是边做java作业边打的一场edu,临近期末ddl的事情很多。

A. Dungeon

题目链接
做法:如果 a + b + c a+b+c a+b+c的和 s u m sum sum是9的倍数而且 m i n ( a , b , c ) ∗ 9 ≥ s u m min(a,b,c)*9 \geq sum min(a,b,c)9sum就可以,原因是只有9的倍数才可能被蓄力炮同时秒掉, m i n ≥ s u m min \geq sum minsum是因为我们要保证前面的蓄力炮不能炸死其中的一个怪,否则就不满足题意了.
代码:

   int T;
   cin >> T;
   while(T--)
   {
      int a,b,c;
      cin >> a >> b >> c;
      int sum = a + b + c;
      if(sum % 9 == 0 && min(a,min(b,c))*9 >= sum)
      {
         cout << "YES" << endl;
      }
      else cout << "NO" << endl;
   }

B. Find The Array

题目链接
做法:我自己的方法是,对于给出的每一个数,我们输出 ≤ a [ i ] \leq a[i] a[i]的最大的那个2的倍数的数。比如一个数字是3,那么它的二进制是11,那么我们应该输出二进制位10的数,即输出2。此结论请读者自己证明。
另外cf讨论区找到了另外一种做法,而且附带有证明,我觉得很好,贴在这里。在这里插入图片描述
下面附上我的方法的代码:

const int N = 55;
ll a[N];
 
ll calc(ll x)
{
   ll wei = 0,t = 1;
   while((t << wei) < x) ++wei;
   return max(1LL,(ll)pow(2,wei-1));
}
 
int main()
{
   int T;
   cin >> T;
   while(T--)
   {
      int n;
      cin >> n;
      rep(i,1,n) cin >> a[i];
      rep(i,1,n)
      {
         cout << calc(a[i]) << " ";
      }
      cout << endl;
   }
}

C. Busy Robot

题目链接
模拟,待补。

D. Pairs

题目链接
今天太晚,思路明天补,其实就是模拟范围。
现附上代码:

const int N = 1e6+6;
 
set<int> s1, s2;
int b[N], vis[N];
int n, ans1, ans2;
void init()
{
   ans1 = 0;
   ans2 = 0;
   cin >> n;
   MEM(vis, 0);
   rep(i, 1, n)
   {
      cin >> b[i];
      vis[b[i]] = 1;
   }
   s1.clear();
   s2.clear();
   rep(i, 1, 2 * n)
   {
      if (vis[i] == 0)
      {
         s1.insert(i);
         s2.insert(i);
      }
   }
}
int solve(int ans1, int ans2)
{
   rep(i, 1, n)
   {
      auto it1 = s1.lower_bound(b[i]);
      auto it2 = s2.lower_bound(b[i]); //找第一个小于b[i]的数
      if (it1 != s1.end())             //如果找到了
      {
         ans1++;
         s1.erase(it1);
      }
      if (it2 != s2.begin())
      {
         ans2++;
         it2--;
         s2.erase(it2);
      }
   }
   return abs(ans1 + ans2 - n) + 1;
}
 
int main()
{
   int T;
   cin >> T;
   while (T--)
   {
      init();
      cout << solve(ans1, ans2) << endl;
   }
   return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值