牛客小白月赛29部分题解
G:涂色
简单签到题,我们可以直观的看出答案其实就是n+1,那么我们直接输出n+1即可
#include<bits/stdc++.h> using namespace std; int main() { int n; scanf("%d",&n); cout<<n+1<<endl; }
E:考试
这其实就是一个简单的数学问题,可能有的时候思维有点混乱,那么就手动写几组数组验证答案的正确性,我们统计一下不相同的题目数量有几个,然后和k比较一下就行,如果比k大,那么说明多的也是错的,如果比k小,那么与k的差值也是错的
#include <iostream> #include <algorithm> #include <cstdio> #include <set> #include <map> #include <math.h> #include <vector> #include <queue> #include <string.h> typedef long long ll; using namespace std; #define pi acos(-1.0) const int maxn = 1e5 + 10; const int inf = 0x3f3f3f3f; const int mod = 1e9 + 7; int a[maxn], b[maxn], vis[maxn]; int main() { int n, k, cnt = 0; scanf("%d%d", &n, &k); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); for (int j = 1; j <= n; ++j) scanf("%d", &b[j]); for (int i = 1; i <= n; ++i) if (a[i] != b[i]) cnt++; if (cnt > k) cout << n - cnt + k << endl; else cout << n + cnt - k << endl; }
H:圆
简单几何题
我们只需要判断两个边界条件,一个是内含,一个是外离,这两种情况就是能够相交的临界情况,在两者之间就是所有能够相交的情况,然后再根据半径之间的关系算出临界值就是答案了
#include <iostream> #include <algorithm> #include <cstdio> #include <set> #include <map> #include <math.h> #include <vector> #include <queue> #include <string.h> typedef long long ll; using namespace std; #define pi acos(-1.0) const int maxn = 1e5 + 10; const int inf = 0x3f3f3f3f; const int mod = 1e9 + 7; int main() { ll t; scanf("%lld", &t); // double pii = 3.1415926535; while (t--) { ll x1, x2, r1, y1, y2, r2; scanf("%lld%lld%lld%lld%lld%lld", &x1, &y1, &r1, &x2, &y2, &r2); double d =sqrt ((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); double maxx=r1+r2; double minn=abs(r1-r2); if (d >= minn&&d<=maxx) puts("YES"); else puts("NO"); } }
A:进攻
贪心算法
首先对战机的破坏力从大到小排序,然后再把基地的防御值进行排序,让价值大的排在前面,如果价值相同则防御力小的排在前面,最后我们让破坏力大的飞机优先攻击价值大的基地,然后计算最大值就行,但是这里有一个坑点,就是基地的价值可能为负数,所以如果基地的价值为负数的话会让我们整个价值变小,那么遇到这种情况的时候,只需要跳过就行了,也就是说不攻击价值为负数的基地
#include <iostream> #include <algorithm> #include <cstdio> #include <set> #include <map> #include <math.h> #include <vector> #include <queue> #include <string.h> typedef long long ll; using namespace std; #define pi acos(-1.0) const int maxn = 1e6 + 10; const int inf = 0x3f3f3f3f; const int mod = 1e9 + 7; struct node { int d, v; bool operator<(const node x) const { if (v != x.v) return v > x.v; else return d < x.d; } } w[maxn]; int a[maxn]; int main() { int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); sort(a + 1, a + n + 1, greater<int>()); for (int i = 1; i <= m; ++i) scanf("%d", &w[i].d); for (int i = 1; i <= m; ++i) scanf("%d", &w[i].v); sort(w + 1, w + m + 1); int s = 1, i = 1; ll ans = 0; while (i <= n && s <= m) { if (a[i] > w[s].d && w[s].v > 0) { ans += w[s].v; ++i; } else ++s; } printf("%lld\n", ans); }