列表

详情


NC234153. 小红的删数字

描述

小红和小紫正在玩一个游戏。
她们拿到了一个正整数 x 。两人轮流每次删掉 x 的一个数位,但必须满足以下条件:
1.小红删掉一个非零数位以后,x 必须是3的倍数。
2.小紫删掉一个非零数位以后,x 必须不能是3的倍数。
谁先无法进行操作则失败。特殊的,每次操作后 x 必须还是一个正整数(可以包含前导零)。因此2、30等数都是无法进行操作的。
小红先进行操作,在两人足够聪明的情况下,谁能获得最终的胜利?

输入描述

一个正整数 x
数据范围:

输出描述

若小红获胜,则输出"kou"
否则输出"yukari"

示例1

输入:

13

输出:

kou

说明:

小红可以先删掉1使数字变为3,而此刻小紫不可以再删,故小红胜利。

示例2

输入:

1024

输出:

yukari

说明:

小红第一次可以删掉1或者4。
然后紫任意删掉剩下两个非零数字中任意一个即可获胜。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 6ms, 内存消耗: 652K, 提交时间: 2022-11-22 20:17:18

#include<bits/stdc++.h>
using namespace std;
int tong[3];

int main(){

  int n,x,i,sum = 0;
  string s;
  cin >> s;
  for(i=0;i<s.length();++i){
    if(s[i]-'0') tong[(s[i]-'0')%3]++;
    sum += s[i]-'0';
  }
  if(!tong[sum%3]) {
    cout << "yukari";
    return 0;
  }
  tong[sum % 3]--;
  if(tong[1] == tong[2] && tong[0]) cout<<"kou";
  else cout<<"yukari";
}

Python3 解法, 执行用时: 86ms, 内存消耗: 5480K, 提交时间: 2022-09-21 09:19:35

from collections import Counter
s = input().strip()
ns = [int(c)%3 for c in s if c != '0']

cnt = Counter(ns)
Sum = sum(ns)

def main():
    if cnt[Sum % 3] == 0:
        return 'yukari'
    cnt[Sum % 3] -= 1
    if cnt[1]==cnt[2] and cnt[0]>0:
        return 'kou'
    else:
        return 'yukari'
    

print(main())

C++ 解法, 执行用时: 5ms, 内存消耗: 524K, 提交时间: 2022-06-14 22:59:11

#include<cstdio>
int x,n[3],p;
char s[100005];
int main(){
	scanf("%s",s);
	for(int i=0;s[i];i++){
		p=(p*10+s[i]-'0')%3;
		if(s[i]=='0') continue;
		++n[(s[i]-'0')%3];
	}
	if(!n[p]) goto B;
	--n[p];
	if(n[1]==n[2]&&n[0]) goto A;
	goto B;
A:
	puts("kou");
	return 0;
B:
	puts("yukari");
	return 0;
}

上一题