牛客小白月赛
A. AOE还是单体?
1.题意
直接看题目
2.思路
只有三种情况,一种是全都单体攻击,二是根据血量最多的直接使用群体技能,三是找到他们血量的中位数然后大于的用单体,最后全用群体技能,三者取一个min
3.代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 200010;
int a[N];
signed main()
{
int n,x; cin >> n >> x;
for(int i = 1 ; i <= n; i ++) cin >> a[i];
sort(a + 1, a + n + 1);
int t2 = a[(n+1) / 2];
int temp = 0;
int res1 = 0, res2 = 0;
int res3 = 0;
for(int i = 1 ;i <= n; i ++)
if(a[i] > t2) temp += a[i] - t2;
res1 += t2 * x + temp;
for(int i = 1; i <= n;i ++) res2 +=a[i];
cout << min(min(res2 , res1),a[n] * x) << endl;
return 0;
}
B. k-size字符串
数论组合数我拒绝
C. 白魔法师
1.题意
一棵树被黑白染色了,让你改变一个黑色的节点使得所求的的白色的联通块最大
2.思路
并查集
去一个并查集去维护白色连通块的大小和编号,然后去遍历黑色的点,从黑色的点开始去看看他连着几个连通块加起来,然后去一个max
3.代码
#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
#define PII pair<int,int>
#define LL long long
#define pb push_back
#define pqp priority_queue<PII,vector<PII>,greater<PII>>
#define pqi priority_queue<int,vector<int>,greater<int>>
#define PSS pair<string,string>
#define in insert
using namespace std;
const int N = 200010,mod = 1e9+7;
int a[N];
vector<int> e[N];
int dist[N];
int book[N],book2[N];
int dx[]= {0,-1,0,1,0,0},dy[]= {-1,0,1,0,0,0},dz[] = {0,0,0,0,-1,1};
int s[N];
int p[N], cnt[N];
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
signed main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
int n; cin >> n;
for(int i = 1 ; i <= n; i ++) p[i] = i;
string s; cin >> s;
for(int i = 1 ; i < n; i ++)
{
int a,b; cin >>a >> b;
e[a].pb(b);
e[b].pb(a);
}
int res = 0;
for(int i = 1 ;i <= n;i ++)
{
if(s[i - 1] == 'W')
{
for(auto x : e[i])
{
if(s[x - 1] == 'W')
{
int a = find(i), b = find(x);
p[a] = b;
}
}
}
}
for(int i =1; i <= n;i ++)
{
int a = find(i);
++cnt[a];
res = max(res, cnt[a]);
}
for(int i =1 ; i <= n;i ++)
{
if(s[i - 1] == 'B')
{
int temp = 1;
for(auto x :e[i]) if(s[x - 1] == 'W') temp += cnt[find(x)];
res = max(res, temp);
}
}
cout << res << endl;
return 0;
}
D. 抽卡
1.题意
就是有n个卡池,每个卡池里面有ai张卡牌然后每个池子你都有都bi个想要的卡,每个卡池只能抽一次牌,问该答案去摸1e9+7的结果
2.思路
正难则反,我们直接求出不能得到卡的概率res,然后用1 - res 就是得到的概率,所以最后的答案为:(mod + 1 - res) % mod, 用到了快速幂求逆元,以及分数的取模,很恶心,不看题解,我不可能会
3.代码
#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
#define PII pair<int,int>
#define LL long long
#define pb push_back
#define pqp priority_queue<PII,vector<PII>,greater<PII>>
#define pqi priority_queue<int,vector<int>,greater<int>>
#define PSS pair<string,string>
#define in insert
using namespace std;
const int N = 100010,M = N *2 ,mod = 1e9+7;
int a[N],b[N];
vector<int> e[N];
int dist[N];
int book[N],book2[N];
int dx[]= {0,-1,0,1,0,0},dy[]= {-1,0,1,0,0,0},dz[] = {0,0,0,0,-1,1};
int s[N];
int p[N], cnt[N];
int qmi(int a ,int k , int p)
{
int res = 1 % p;
while(k)
{
if(k & 1) res = res * a % p;
a = a * a % p;
k >>= 1;
}
return res;
}
signed main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
int n; cin >> n;
for(int i = 1; i <= n;i ++) cin >>a[i];
for(int i = 1; i <= n;i ++) cin >> b[i];
int res = 1;
for(int i = 1 ; i<= n;i ++) res = res * (a[i] - b[i]) % mod * qmi(a[i]% mod ,mod - 2 ,mod) % mod;
cout << (mod + 1 - res) % mod << endl;
return 0;
}
E. 点击消除
1.题意
给你一个字符串,可以消去两个相邻并且相同的字母,如果消除后的字符串还还满足两个相邻并且相等的字母就要继续消除,问最短的长度是多少,可以为0
2.思路
真的没想到这个可以直接用stack做,太神奇了,每次与栈顶比较,如果栈顶相同则干掉栈顶,否则插入,最后存到vector 然后 reverse一下 遍历输出
3.代码
#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
#define PII pair<int,int>
#define LL long long
#define pb push_back
#define pqp priority_queue<PII,vector<PII>,greater<PII>>
#define pqi priority_queue<int,vector<int>,greater<int>>
#define PSS pair<string,string>
#define in insert
using namespace std;
const int N = 100010,M = N *2 ,mod = 1e9+7;
int a[N],b[N];
vector<int> e[N];
int dist[N];
int book[N],book2[N];
int dx[]= {0,-1,0,1,0,0},dy[]= {-1,0,1,0,0,0},dz[] = {0,0,0,0,-1,1};
int s[N];
int p[N], cnt[N];
signed main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
string s; cin >> s;
stack<char> sk;
for(int i = 0; i < s.size() ;i ++)
{
if(sk.size() && sk.top() == s[i]) sk.pop();
else sk.push(s[i]);
}
vector<char> ans;
while(sk.size())
{
ans.pb(sk.top());
sk.pop();
}
reverse(ans.begin() , ans.end());
if(ans.size() == 0) cout << 0 << endl;
else{
for(auto x : ans) cout << x;
}
return 0;
}
F.疯狂的自我检索者
1.题意
没啥好说的
2.思路
模拟
3.代码
#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
#define PII pair<int,int>
#define LL long long
#define pb push_back
#define pqp priority_queue<PII,vector<PII>,greater<PII>>
#define pqi priority_queue<int,vector<int>,greater<int>>
#define PSS pair<string,string>
#define in insert
using namespace std;
const int N = 100010,M = N *2 ,mod = 1e9+7;
int a[M],b[N];
vector<int> e[N];
int dist[N];
int book[N],book2[N];
int dx[]= {0,-1,0,1,0,0},dy[]= {-1,0,1,0,0,0},dz[] = {0,0,0,0,-1,1};
int s[N];
int p[N], cnt[N];
signed main()
{
//ios_base::sync_with_stdio(0); cin.tie(0);
int n,m; cin >> n >> m;
int sum = 0;
for(int i = 1 ; i <= n - m ;i ++) cin >> a[i], sum += a[i];
printf("%.5f ",(double)(sum + m) / n);
printf("%.5f\n",(double)(sum + 5 * m) / n);
return 0;
}
G. 解方程
1.题意
求方程组
2.思路
二分,解锁了浮点数二分的新姿势,很开心
3.代码
#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
#define PII pair<int,int>
#define LL long long
#define pb push_back
#define pqp priority_queue<PII,vector<PII>,greater<PII>>
#define pqi priority_queue<int,vector<int>,greater<int>>
#define PSS pair<string,string>
#define in insert
using namespace std;
const int N = 100010,M = N *2 ,mod = 1e9+7;
vector<int> e[N];
int dist[N];
int book[N],book2[N];
int dx[]= {0,-1,0,1,0,0},dy[]= {-1,0,1,0,0,0},dz[] = {0,0,0,0,-1,1};
int s[N];
int p[N], cnt[N];
double a ,b, c;
signed main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
cin >>a >> b >> c;
double l = 0, r = 1e9 ,mid;
int temp = 1000;
while(temp --)
{
double ans = 1;
mid = (l + r) / 2;
for(int i = 1 ; i <= a ; i ++) ans = ans * mid;
ans += b * log(mid);
if(ans >= c) r = mid;
else l = mid;
}
printf("%.14f\n", mid);
}
H。神奇的字母(二)
1。题意
没啥好说的
2.思路
模拟
3.代码
#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
#define PII pair<int,int>
#define LL long long
#define pb push_back
#define pqp priority_queue<PII,vector<PII>,greater<PII>>
#define pqi priority_queue<int,vector<int>,greater<int>>
#define PSS pair<string,string>
#define in insert
using namespace std;
const int N = 100010,M = N *2 ,mod = 1e9+7;
vector<int> e[N];
int dist[N];
int book[N],book2[N];
int dx[]= {0,-1,0,1,0,0},dy[]= {-1,0,1,0,0,0},dz[] = {0,0,0,0,-1,1};
int s[N];
int p[N], cnt[N];
double a ,b, c;
signed main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
char t; string s;
while(cin >> t) s +=t;
sort(s.begin(),s.end());
//cout << s<< endl;
int temp = 0,ans = 0; char tchar = '0';
for(int i = 0; i < s.size() ; i ++)
{
temp = 0;
while(s[i] == s[i + 1])
{
temp ++;
i ++;
}
if(ans < temp)
{
tchar = s[i];
ans = temp;
}
}
cout << tchar << endl;
return 0;
}
I.十字爆破
1.题意
没啥好说的
2.思路
模拟
3.代码
#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
#define PII pair<int,int>
#define LL long long
#define pb push_back
#define pqp priority_queue<PII,vector<PII>,greater<PII>>
#define pqi priority_queue<int,vector<int>,greater<int>>
#define PSS pair<string,string>
#define in insert
using namespace std;
const int N = 1010,M = N *2 ,mod = 1e9+7;
vector<int> e[N];
int dist[N];
int book[N],book2[N];
int dx[]= {0,-1,0,1,0,0},dy[]= {-1,0,1,0,0,0},dz[] = {0,0,0,0,-1,1};
int a[N * N],b[N * N];
signed main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
int n,m; cin >>n >>m;
int g[n + 1][m + 1];
for(int i = 1 ; i <= n;i ++)
for(int j = 1 ; j <= m ;j ++)
{
cin >> g[i][j];
a[i] += g[i][j];
b[j] += g[i][j];
}
for(int i = 1 ; i <= n;i ++)
{
for(int j = 1 ; j <= m; j ++)
cout << a[i] + b[j] - g[i][j] <<' ';
cout << endl;
}
return 0;
}

浙公网安备 33010602011771号