在同一天里,Takahashi在时分起床,Aoki在时分秒起床,请问谁起床更早?
输出起得更早的人的名字(Takahashi
或Aoki
)。
输出 | ||||
---|---|---|---|---|
Aoki |
||||
Takahashi |
||||
Takahashi |
思路很明显,直接判断是否成立即可。
#include <cstdio>
using namespace std;
int main()
{
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
puts((a == c? b <= d: a < c)? "Takahashi": "Aoki");
return 0;
}
给定整数序列。求最小的不在中的自然数。
输出一行,即最小的不在中的自然数。
略,请自行前往AtCoder查看
由于题面中有限制,所以我们直接开一个数组记录中每个数是否出现过即可。
本题方法很多,这里介绍的是最快的算法,时间复杂度。
#include <cstdio>
using namespace std;
bool used[2005];
int main()
{
int n;
scanf("%d", &n);
while(n--)
{
int a;
scanf("%d", &a);
used[a] = true;
}
int i = -1;
while(used[++i]);
printf("%d\n", i);
return 0;
}
给定两个长度为的整数序列和。
问是否存在序列,满足如下条件:
如果存在符合全部条件的,输出Yes
;否则,输出No
。
略,请自行前往AtCoder查看
好家伙,C题都要用dp……
本题普通的方法貌似不太好做,因此我们考虑。
令选择能否等于,能否等于。
然后状态转移方程就简单了,详见代码。
#include <cstdio>
#define maxn 200005
using namespace std;
int a[maxn], b[maxn];
bool f[maxn], g[maxn];
int main()
{
int n, k;
scanf("%d%d", &n, &k);
for(int i=0; i<n; i++)
scanf("%d", a + i);
for(int i=0; i<n; i++)
scanf("%d", b + i);
f[0] = g[0] = true;
#define set(x, y, z) x |= y - z <= k && z - y <= k
for(int i=1; i<n; i++)
{
if(f[i - 1])
set(f[i], a[i - 1], a[i]),
set(g[i], a[i - 1], b[i]);
if(g[i - 1])
set(f[i], b[i - 1], a[i]),
set(g[i], b[i - 1], b[i]);
}
puts(f[n - 1] || g[n - 1]? "Yes": "No");
return 0;
}
注:本题还有一种很奇怪的解法,就是直接判断相邻的四种连接方式是否有至少一种能连通,比如#30453703,如果有大佬能证明这种方法的正确性,欢迎在评论区留言告诉我,谢谢!
我们有三个多项式
已知和且(),求。
换句话说,给定多项式和每一项的系数,求多项式。
题目保证存在合法的。
输出,用空格分隔。
略,请自行前往AtCoder查看
本题可以直接模拟多项式的大除法运算,运算时只需记录系数即可。
#include <cstdio>
#define maxn 105
using namespace std;
int a[maxn], b[maxn], c[maxn << 1];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for(int i=0; i<=n; i++) scanf("%d", a + i);
for(int i=0; i<=n+m; i++) scanf("%d", c + i);
for(int i=m; i>=0; i--) // NOTE: 必须倒推!
{
b[i] = c[n + i] / a[n];
for(int j=0; j<=n; j++)
c[i + j] -= a[j] * b[i];
}
for(int i=0; i<=m; i++)
printf("%d ", b[i]);
return 0;
}
我们有块巧克力和个盒子。第块巧克力长厘米,宽厘米;第个盒子长厘米,宽厘米。
问是否能把巧克力分别装在盒子里,使其满足如下条件:
如果有合法的方法,输出Yes
;否则,输出No
。
本题可以考虑如下贪心算法:
No
。Yes
;否则,输出No
。本算法的时间复杂度是,但经过multiset
优化后可降为,具体实现详见代码。
#include <cstdio>
#include <set>
#include <algorithm>
using namespace std;
struct Item {
int w, h;
bool type;
inline bool operator <(const Item& i2) const {
return w == i2.w? type > i2.type: w > i2.w;
// ^^^^^^^^^^^^^^
// 注意sort必须有严格顺序,一开始我这里写成了type==1导致RE,详见:
// https://atcoder.jp/contests/abc245/submissions/30526563
}
} v[400005];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
// Chocolate
for(int i=0; i<n; i++) scanf("%d", &v[i].w);
for(int i=0; i<n; i++) scanf("%d", &v[i].h);
// Box
m += n;
for(int i=n; i<m; i++) scanf("%d", &v[i].w);
for(int i=n; i<m; i++) scanf("%d", &v[i].h);
for(int i=n; i<m; i++) v[i].type = 1;
// Algorithm
sort(v, v + m);
multiset<int> s;
for(int i=0; i<m; i++)
{
const Item& it = v[i];
if(it.type) s.insert(it.h); // Box
else
{
auto itr = s.lower_bound(it.h);
if(itr == s.end())
{
puts("No");
return 0;
}
s.erase(itr);
}
}
puts("Yes");
return 0;
}