中暑4天回来的“真”复建场
已经不敢熬夜了,所以这场是早上 vp 的
A
思路:
存在两个相同数字就行
void solve(){
bool ok = 0;
set<int> st;
cin>>n;
For(i,0,n-1){
cin>>x;
if(st.count(x)) ok = 1;
st.insert(x);
}
puts(ok?"YES":"NO");
}
B
思路:
就是每两个选大的那个,奇偶起点不同
void solve(){
cin>>n;
vector<int> num(n);
for(auto &x:num)cin>>x;
sort(all(num));
ll ans = 0;
for(int i=((n&1)^1); i<n; i+=2) ans += num[i];
cout<<ans<<'\n';
}
C
交互题,不会,过
D
思路:
WK!就是我想的那样,就两种方法,刀掉下面那个,要么直接摔死,要么从前面一个底端伤害为 $1$ 然后刀掉
就是这样的
定义:$dp[i]:$ 前 $i$ 个位置死亡的最小攻击次数
转移:$dp[i] = min(dp[i-2] + num[i] - (i-1), dp[i-1] +num[i-1] + num[i]-1)$
事后:但凡我愿意沿着那个猜测大胆写一下,都不至于需要看题解来给自己增加信心,才写出来,靠
void solve(){
cin>>n;
vector<int> num(n+1), dp(n+1,0);
For(i,1,n)cin>>num[i];
dp[0]=0,dp[1] = num[1];
For(i,2,n) dp[i] = min(dp[i-1] + num[i]-1, dp[i-2] +num[i-1]+ max(0ll,num[i] - (i-1)));
cout<<dp[n]<<'\n';
}

浙公网安备 33010602011771号