A. Chip Game
题意:给出n行m列组成的网格,最开始在左下角,只能向右或者向上移动奇数个单位,移动到右上角时则不能再走了,T和B轮流走,B先走,在双方最优选择的情况下,谁会赢,谁能够先走到右上角谁就赢了,
思路:简单推一下发现,n和m均为奇数或者均为偶数的情况下,T赢,否则B赢。
AC code:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int main(){
int t;
cin>>t;
while(t--){
cin>>n>>m;
if((n&1 && m&1) || (n%2==0 && m%2==0)) cout<<"Tonya"<<endl;
else cout<<"Burenka"<<endl;
}
return 0;
}
B. Mathematical Circus
题意:给出一个偶数n和常数k,从1-n中选择n/2对数字,每一对数字分别为a,b,判断对于每对数字,对于(a+k)*b是否与4整除,如果满足,则输出每对数字。
思路:观察样例可以发现,如果满足条件,输出的每对数字是相邻的,即1,2 3,4 5,6......n-1,n。只是a,b的顺序不同而已,如果k是奇数,那么(奇数+k)*偶数后一定是4的倍数,如果k是偶数,只有当k与偶数相加后是4的倍数才行,那么就是(偶数+k)*奇数,或者当a或b中有一个为4的倍数时,那么就是(奇数+k)*偶数,不一定全部偶数k+偶数后还是4的倍数,所以需要check一下。
AC code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
void solve(){
cin>>n>>k;
if(k==0){
cout<<"NO"<<endl;
return ;
}
if(k%2==0){
for(int i=2;i<=n;i+=4){
if((i+k)%4!=0){
cout<<"NO"<<endl;
return ;
}
}
}
cout<<"YES"<<endl;
if(k&1){
for(int i=1;i<=n;i+=2){
cout<<i<<' '<<i+1<<endl;
}
}else{
int cnt=1;
for(int i=1;i<=n;i+=2){
if(cnt&1){
cout<<i+1<<' '<<i<<endl;
}else{
cout<<i<<' '<<i+1<<endl;
}
cnt++;
}
}
}
signed main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
C. Fighting Tournament
题意:有n个运动员排成一排,运动员编号依次为1-n,每一个运动员有一个力量值ai,从第一个运动员开始与后面一个运动员比赛,力量值大的获胜,获胜的运动员继续与后面的运动员比赛,输的运动员就放到最后,给出i和k,代表运动员的编号和比赛轮数,求该运动员的获胜场数。
思路:如果没有轮到该运动员比赛或者在之前遇到了力量值比他大的运动员,那他的获胜场数一定为0,如果他是力量值最大的运动员,则他的获胜场数为k-(i-1)+1。
如果在他前面的运动员都比他力量值低,但是后面可能又会出现力量值比他强的,我们可以预处理k和获胜场次即可得到答案。
AC code:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int T;
int a[N];
int s[N];
signed main()
{
cin >> T;
while (T--)
{
int n, q;
scanf("%lld%lld", &n, &q);
memset(s, 0, sizeof s);
int ma = 0, mai = -1;
for (int i = 1; i <= n; ++i) {
scanf("%lld", &a[i]);
if (ma < a[i]) ma = a[i], mai = i;
}
for (int i = 1; i <= mai; ) {
int x = i + 1;
while (a[i] > a[x] && x <= mai) ++s[i], ++ x;//在最大值之前,在该运动后面有多少个比他力量值小的运动员,这些比他小的运动员在该运动员之后,所以他们的获胜场次一定为0
if(x <= mai) s[x] ++;
i = x;//比a[i]小的同时在i后面的都不用管,胜场为0,直接更新i即可
}
while (q--)
{
int i, k;
scanf("%lld%lld", &i, &k);
if (i > mai || k < i - 1) {
printf("%d\n", 0);
}
else {
int c = max((int)1, i - 1);
if (i < mai) {
if(k - c >= s[i])printf("%lld\n", s[i]);
else if(k == c) printf("%lld\n", 1);
else printf("%lld\n", k - c + 1);
}
else {
if (k >= c) printf("%lld\n", k + 1 - c);
}
}
}
}
return 0;
}
努力刷题补题,打vp,写题解,小萌新想争取上1700!!!
再菜也要打,一定要上去!!!