概述
索引
- 100EDU祭
- 本文状态:更新中
- A. Dungeon
- B. Find The Array
- C. Busy Robot
- D. Pairs
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)∗9≥sum就可以,原因是只有9的倍数才可能被蓄力炮同时秒掉,
m
i
n
≥
s
u
m
min geq sum
min≥sum是因为我们要保证前面的蓄力炮不能炸死其中的一个怪,否则就不满足题意了.
代码:
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;
}
最后
以上就是勤奋月饼为你收集整理的Educational Codeforces Round 100 (Rated for Div. 2)100EDU祭的全部内容,希望文章能够帮你解决Educational Codeforces Round 100 (Rated for Div. 2)100EDU祭所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复