A. Stickogon
我们可以发现贪心构成正三角形最优。
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
void solve(){
int n;
cin>>n;
map<int,int>mp;
for(int i=0,t;i<n;i++){
cin>>t;
mp[t]++;
}
int res=0;
for(auto [i,j]:mp)res+=j/3;
cout<<res<<'\n';
return;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
B. A BIT of a Construction
当n=1时输出k就行。
当n>1时设k的最高位为x则2x≤k<2x+12^x\leq k<2^{x+1}2x≤k<2x+1,
只有当k=2x+1−1k=2^{x+1}-1k=2x+1−1时此时1的个数为x+1,
否则我们1的个数只能达到x,可以拆成2x−12^x-12x−1和k−2x+1k-2^x+1k−2x+1。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve() {
int n, k;
cin >> n >> k;
vector<int> a(n);
if (n == 1) {
a[0] = k;
}
else {
int msb = 0;
for (int i = 0; i < 31; i++) {
if (k & (1 << i)) {
msb = i;
}
}
a[0] = (1 << msb) - 1;
a[1] = k - a[0];
for (int i = 2; i < n; i++) {
a[i] = 0;
}
}
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << "\n";
return;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
solve();
}
return 0;
}
C. How Does the Rook Move?
我们可以发现k次操作其实等价于将边长为n的正方形缩减,k次操作中x=y的操作边长减1,否则则减少2。
设剩下的正方形边长为m。
那接下来的问题就是如何去画剩下的格子。剩下的格子还是两种操作。我们可以枚举有i个x!=y的操作,然后其实就是在m中选i*2个使他们两两配对,并且两两配对具有有序性,即{x,y}与{y,x}不一样因为,可以设在前的为玩家下的,在后的为机器人下的,这样我们就有Cm2∗i∗(2∗i)!i!\frac{C_{m}^{2*i}*(2*i)!}{i!}i

最低0.47元/天 解锁文章
667

被折叠的 条评论
为什么被折叠?



