A. Cards for Friends
题意:给你一张纸片的长和宽,如果是长或者宽为偶数那么就可以沿着其对半剪开, 对应的总数会增加,求最后的纸片数能不能大于k个。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--) {
cin>>W>>H>>N;
ll a=1;
while(W%2==0) W/=2, a*=2;
while(H%2==0) H/=2, a*=2;
if(a>=N) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
B. Fair Division
题意:父母给了n块糖果,每块的重量不是1就是2,求A和B得到的糖果的重量会不会是相同的。
思路:可以推出数学公式,如果推不出来就像我一样枚举其中一个人拿的1的个数,然后去判断剩下所需要的拿的2的个数,判断需要2的个数够不够。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,w,h,n,i,j;
cin>>t;
while(t--){
cin>>n;
int sum=0,cnt1=0,cnt2=0;
for(i=0;i<n;i++){
cin>>j;
sum+=j;j==1?cnt1++:cnt2++;
}
if(sum%2!=0){
scNO;
}
else {
int flag=0;
sum/=2;
for(i=0;i<=cnt1;i++){
if((sum-i)%2==0){
(sum-i)/2<=cnt2?flag=1:1;
}
}
if(flag==1) {
scYES;
}
else scNO;
}
}
return 0;
}
C. Long Jumps
题意:求最大的对答案的贡献值,贡献值是当前坐标i+a[i]只要当前的值<=N,就可以一直加,算每个坐标i的贡献值,求其中最大的。
思路:从后往前模拟跳跳乐~
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
int a[maxn],ans[maxn];
#define int long long
signed main()
{
int t,i,j,n,x;
cin>>t;
while(t--){
memset(ans,0,sizeof(ans));
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
}
int ansss=0;
for(i=n;i>=1;i--){
ans[i]=a[i];
ans[i]+=ans[min((ll)n+1,i+a[i])];
ansss=max(ansss,(ll)ans[i]);
}
cout<<ansss<<endl;
}
return 0;
}
D. Even-Odd Game
题意:alice和bob玩游戏,alice 先动,可以从数组里拿个偶数或者奇数,拿偶数自身积分加上数组的值,bob拿奇数加分,两边都最优看谁赢的游戏。
思路:一开始去想情况,wa了想错了,后面一想,其实就是排序之后贪心判断
const int maxn=2e5+1000;
int a[maxn],ans[maxn];
int ou[maxn],ji[maxn];
#define int long long
bool cmp(int a,int b){
return a>b;
}
signed main()
{
int t,i,j,n,x;
cin>>t;
while(t--){
scanf("%lld",&n);
int cnt0=0,cnt1=0;
for(i=0;i<n;i++){
scanf("%lld",&x);
a[i]=x;
}
int f1=0;
sort(a,a+n,cmp);
int sum1=0,sum2=0;
for(i=0; i<n; i++)
{
if(f1==0)
{
if(a[i]%2==0) sum1+=a[i];
f1++;
}
else
{
if(a[i]%2==1) sum2+=a[i];
f1--;
}
}
if(sum1==sum2) cout<<"Tie"<<endl;
else
{
if(sum1>sum2)
{
cout<<"Alice"<<endl;
}
else
{
cout<<"Bob"<<endl;
}
}
}
return 0;
}