前言
蒟蒻又来发题解啦,和队友写题的一天~~
A. Cards for Friends
题目的大致意思:给定宽w长h的卡片,只有当卡片的宽或者长为偶数的时候卡片才能被分成w/2,h不变或者h/2,w不变的卡片;或者h等于1时把卡片分成w个1*1的卡片,w等于1时同样。最后记录卡片最后的个数,与k相比,如果个数没有达到k就输出NO,否则输出YES.(水题~)
题解:
#include<iostream>
using namespace std;
int main(){
int t;
cin >> t;
while(t--){
int w, h, n;
long long ans = 1;
cin >> w >> h >> n;
while(w % 2 == 0) ans *= 2, w /= 2;
while(h % 2 == 0) ans *= 2, h /= 2;
if(ans >= n) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
B. Fair Division
题目的大致意思:有1g和2g的糖果,不能把同一个糖果拆分,问能否将一组糖果分成2组,使得两组糖果质量相等。
解题思路:将所有的糖果质量全部加起来,无非是三种情况,第一种是能够平均分成两组;第二种质量和都不能平均分;第三种糖果个数不能平分而且有质量为1g的糖果
题解:
#include<iostream>
using namespace std;
int main(){
int t;
cin >> t;
while(t--){
int sum =0;
bool f = 0;
int n;
cin >> n;
for(int i = 0; i < n; i++){
int x;
cin >> x;
sum += x;
if(x == 1) f = 1;
}
if(sum %2!=0) cout << "NO" << endl;
else if(n%2!=0 && !f) cout << "NO" << endl;
else cout << "YES" << endl;
}
return 0;
}
C. Long Jumps
题目的大致意思:给定一个数组大小为n的数据,从索引为1开始,求i+a[i]的值,如果i+a[i]>n,分数score=a[i];否则i=i+a[i],前面i+a[i]的和继续加现在的a[i]再比较,score加上a[i],(后面的a[i])如此往复直到i+a[i]的总和能够大于n。(循环求最大值就好)
题解:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int t;
cin >> t;
while(t--){
int n;
cin>>n;
int a[n+1],Max=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i = n;i > 0;i--){
if(i+a[i]<=n) a[i] += a[i+a[i]];
if(a[i] > Max) Max = a[i];
}
cout << Max << endl;
}
return 0;
}
D. Even-Odd Game
题目的大致意思:Alice和Bob对战,每次两个人取走数组中的一个元素,如果Alice取到了偶数就给自己加上相应的分数,如果奇数就不作任何操作;Bob恰好相反。(取走的数字不能再次被取。)比较两者最后的分数,输出谁获胜,如果是平局就输出Tie。
解题思路:博弈思想,应该将数组所有的元素从大到小排序,每次每个人都拿所有数中的最大数,能给自己加分就加给自己,不能也要销毁不能将最大的数字留给对方。
题解:
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int x, int y) { return x > y; }
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
long long a[200001];
long long Alice = 0, Bob = 0;
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++) {
if (i % 2 == 1) {
if (a[i] % 2 == 0)Alice += a[i];
}
else {
if (a[i] % 2 == 1)Bob += a[i];
}
}
if (Alice > Bob)cout << "Alice" << endl;
else if (Alice < Bob)cout << "Bob" << endl;
else cout << "Tie" << endl;
}
return 0;
}
总结
题目难度不大,后面的难题以后再补啦~