CF999
A
link
首先,每次操作(第一次除外)之前
那么就是说操作过至少一次后,有几个奇数就有几分。
那么如果有至少一个偶数,那么第一次用偶数可以得分,后面再用奇数可以得分,偶数的不了分,最终得分就是奇数个数加一,如果没有偶数,第一次必须用奇数,得不了分,后面一直用奇数,最终得分就是奇数个数减一。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n;
int a[105];
bool is_ou;
int sum_ji;
void qwq(){
cin >> n;
is_ou = 0;sum_ji = 0;
for(int i = 1;i <= n;++ i){
cin >> a[i];
if(a[i]%2 == 0) is_ou = 1;
else sum_ji++;
}
if(is_ou){
cout << sum_ji+1 << endl;
}
else{
cout << sum_ji-1 << endl;
}
}
signed main(){
int t;
cin >> t;
while(t--) qwq();
return 0;
}
B
link
我们设
那么
那么我们要让腰尽可能长,上底与下底之差尽可能小。
寻找至少有两个的最大数为腰,找差最小的两个数为上下底,判断是否满足
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n;
int a[200005];
int b[200005];
int m;
int x,y,c;
map<int,int> js;
void qwq(){
js.clear();
x = y = c = 0;
cin >> n;
for(int i = 1;i <= n;++ i)
cin >> a[i],js[a[i]]++;
sort(a+1,a+1+n);
for(int i = n;i >= 1;-- i){
if(js[a[i]] >= 2){
js[a[i]] -= 2;
c = a[i];
break;
}
}
if(c == 0){
cout << -1 << endl;
return;
}
m = 0;
for(int i = 1;i <= n;++ i)
if(a[i] != a[i-1]&&js[a[i]]) b[++m] = a[i];
int ans = 1e8+5;
for(int i = 1;i <= m;++ i){
if(js[b[i]] >= 2){
ans = 0;
x = y = b[i];
}
if(i != 1&&b[i]-b[i-1] < ans){
ans = b[i]-b[i-1];
x = b[i-1];
y = b[i];
}
}
if(x+c+c > y)
cout << x << " " << c << " " << c << " " << y << endl;
else cout << -1 << endl;
}
signed main(){
int t;
cin >> t;
while(t--) qwq();
return 0;
}
C
link
那么如果他是骗子,前一个人一定要是好人。
如果他是好人,分两种情况:
1.前一个人是好人(
2.前一个人是骗子,那么前前一个人一定是好人(
最后答案是最后一个人是骗子或好人的方案数和。
点击查看代码
#include<bits/stdc++.h>
#define mod 998244353
using namespace std;
int n;
int a[200005];
int f[200005][2];
void qwq(){
cin >> n;
for(int i = 1;i <= n;++ i) cin >> a[i];
memset(f,0,sizeof(f));
f[1][0] = 1;
if(a[1] == 0) f[1][1] = 1;
for(int i = 2;i <= n;++ i){
f[i][0] = f[i-1][1];
if(a[i] == a[i-1]) f[i][1] = f[i-1][1];
if(a[i] == a[i-2]+1)
f[i][1] += f[i-1][0],f[i][1] %= mod;
}
cout << (f[n][0]+f[n][1])%mod << endl;
}
signed main(){
int t;
cin >> t;
while(t--) qwq();
return 0;
}
D
link
差不超过
那么我们就递归拆分每一个
都凑出来了并且
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[200005];
int b[200005];
int s;
map<int,int> am;
bool find(int x){
if(am[x]){
am[x]--;
return true;
}
if(x == 0) return false;
int b1 = x/2;
int b2 = x-b1;
if(find(b1)&&find(b2)) return true;
else return false;
}
void qwq(){
s = 0;
am.clear();
bool f = 1;
cin >> n >> m;
for(int i = 1;i <= n;++ i)
cin >> a[i],am[a[i]]++,s += a[i];
for(int i = 1;i <= m;++ i){
cin >> b[i];s -= b[i];
if(f&&(!find(b[i]))){
f = 0;
}
}
if(f&&s == 0) cout << "Yes\n";
else cout << "No\n";
}
signed main(){
int t;
cin >> t;
while(t--) qwq();
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析