3.电子舞龙【算法赛】 - 蓝桥云课
string s;
LL l,r,u,d;void solve()
{cin >> s;for (int i = 0;i < s.size();i ++){if (s[i] == 'L') l ++;else if (s[i] == 'R') r ++;else if (s[i] == 'U') u ++;else d ++;}LL t1 = abs(l - r);LL t2 = abs(u - d);if ((t1 + t2) % 2 != 0) cout << -1 << endl;else{cout << (t1 + t2) / 2 << endl;}
}
4.舞狮【算法赛】 - 蓝桥云课
参考大佬思路
ai要大于它所在这个组前面所有成员数量,采用贪心策略,将数组升序排序,每次用最小的数组长度跟ai比较,看能否满足最小数组长度+1<=ai,如果满足则更新该数组长度,否则新开一个数组。这个过程我们可以使用小顶堆来完成
个人理解:
堆里存放的每个数组的长度(数量),根据题目,我们可以只维护数组的长度,每次贪心的找长度最短的数组将新的元素a[i]放入该数组,可以保证最后堆的数量就是最少的分成的队的数量
const int N = 1e5 + 10;int n;
LL a[N];
priority_queue<LL,vector<LL>,greater<LL>> heap;void solve()
{cin >> n;for (int i = 1;i <= n;i ++) cin >> a[i];sort(a + 1, a + 1 + n);heap.push(1);//(推入第一个元素)数组长度为1for (int i = 2;i <= n;i ++){if (heap.top() + 1 <= a[i])//当前元素满足a[i] >= 长度 + 1{LL len = heap.top();heap.pop();heap.push(len + 1);}else heap.push(1);//不满足就新开一个数组把a[i]放进去}cout << heap.size() << endl;
}
6.春晚魔术【算法赛】 - 蓝桥云课
手动模拟一下相乘的过程就可发现一下规律
const int mod = 1e9 + 7;LL a,b,c,n;LL qmi(LL a,LL b)
{LL res = 1;while(b){if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}void solve()
{cin >> a >> b >> c >> n;LL t1 = a * b % mod * c % mod;LL t2 = qmi(2,n);cout << qmi(t1,t2) % mod << endl;}