C :Jumping Takahashi
题意:
小T开始在坐标为0的横轴上,它会经过N次跳跃,在第 i i i次跳跃 ( 1 ≤ i ≤ N ) (1\le i \le N) (1≤i≤N),他会移动 a i 或 者 b i a_i或者b_i ai或者bi的距离,求经过N次跳跃后,小T是否能到达N点。
思路:
因为a和b必须选择一个,所以我们就一直选最小的那个,并且把两者的差记录下来,同时更新 1 − 1 e 4 1 - 1e4 1−1e4中,可以达到的值,然后最后看是否存在 最 小 值 + 数 组 存 在 的 值 = X 最小值+数组存在的值= X 最小值+数组存在的值=X
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
int vis[30005];
int main()
{
int n, x;
scanf("%d%d", &n, &x);
int mmin = 0;
//初始化,这样下面就不用特地将每个出现过的值都赋1
vis[0] = 1;
for (int i = 1; i <= n; i++)
{
int a, b;
scanf("%d%d", &a, &b);
//一直加最小值
mmin += min(a, b);
//记录该差值,可以和其他差值形成的值
int num = abs(a - b);
//这里要倒序
//不然的话i + num在后边遍历到i 为i + num的时候当前数会被使用第二次
for (int i = 10000; i >= 0; i--)
if (vis[i])
vis[i + num] = 1;
}
if (x >= mmin && vis[x - mmin])
printf("Yes\n");
else
printf("No\n");
return 0;
}
D - Strange Balls
大模拟
#include <stdio.h>
int p[200005];
int s[200005];
int main()
{
int n;
scanf("%d", &n);
int t = 0;
for (int i = 1; i <= n; i++)
{
int x;
scanf("%d", &x);
p[++t] = x;
if (t == 1 || p[t] != p[t - 1])
s[t] = 1;
else
s[t] = s[t - 1] + 1;
if (s[t] == x)
t -= x;
printf("%d\n", t);
}
return 0;
}