很多个入门题一起说
HDU1856
简单到没意思的博弈
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int n,m;
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
if(n%(m+1)){
cout<<"first"<<endl;
}
else{
cout<<"second"<<endl;
}
}
return 0;
}
HDU1847
巴什博弈
水题
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
int main(){
while(scanf("%d",&n)!=EOF){
if(n%3){
cout<<"Kiki"<<endl;
}
else{
cout<<"Cici"<<endl;
}
}
return 0;
}
HDU1527
wythoff博弈,直接套公式
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const double op = (sqrt(5)+1)/2;
int main(){
int a,b;
while(scanf("%d%d",&a,&b)!=EOF){
if(a>b) swap(a,b);
int d=b-a;
double dd=d*op;
if(a==(int)(dd)) {
cout<<"0"<<endl;
}
else{
cout<<"1"<<endl;
}
}
return 0;
}
HDU2177
wythoff博弈,找必败态,方程不好解,只好刷一遍
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int a,b;
const double op = (sqrt(5)+1)/2;
int main(){
while(scanf("%d%d",&a,&b)!=EOF){
if(a==0&&b==0) break;
if(a>b) swap(a,b);
int d=b-a;
double dd=op*d;
if((int)dd==a){
cout<<"0"<<endl;
}
else{
cout<<"1"<<endl;
if((int)(dd)<a){
cout<<(int)(d*op)<<" "<<(int)(d*op)+d<<endl;
}
if(a==0)cout<<0<<" "<<0<<endl;
for(int i=1;i<=b;i++){
int tmp=(int)(i*op);
if(tmp==(int)(d*op)) continue;
if(tmp==a) cout<<a<<" "<<a+i<<endl;
else if(tmp+i==b) cout<<b-i<<" "<<b<<endl;
else if(tmp+i==a) cout<<a-i<<" "<<a<<endl;
}
}
}
return 0;
}
HDU1849
NIM游戏,没多少意思
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
//其实就是nim游戏
const int MAXN = 1010;
int a[MAXN];
int main(){
int n;
while(scanf("%d",&n)!=EOF&&n){
int ans=0;
int d;
for(int i=0;i<n;i++){
scanf("%d",&d);
ans=ans^d;
}
if(ans) cout<<"Rabbit Win!"<<endl;
else cout<<"Grass Win!"<<endl;
}
return 0;
}
HDU2176
NIM游戏,找到一个构造的取法,具体的就是利用消去率,在等式两边来进行一个构造
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 200000+10;
int a[MAXN];
int main(){
int n;
while(scanf("%d",&n)!=EOF&&n){
int ans=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
ans=ans^a[i];
}
// cout<<ans<<endl;
if(ans){
cout<<"Yes"<<endl;
for(int i=0;i<n;i++){
int tmp=a[i]^ans;//注意,0是不变元,a^a=0,左右式子全部^a[i]
if(tmp<=a[i]){//说明对于这个是可取的
cout<<a[i]<<" "<<tmp<<endl;
}
}
}
else{
cout<<"No"<<endl;
}
}
return 0;
}
HDU1564
将棋盘转化为一个黑白的棋盘,直接考虑奇偶性就行
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)!=EOF&&n){
if(n&1){
cout<<"ailyanlu"<<endl;
}
else{
cout<<"8600"<<endl;
}
}
return 0;
}
POJ2488
对称性的模仿
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)!=EOF&&n){
if(n<3){
cout<<"Alice"<<endl;
}
else{
cout<<"Bob"<<endl;
}
}
return 0;
}
POJ1740
拆开最大的那个
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[12];
int main(){
int n;
while(scanf("%d",&n)!=EOF&&n){
memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
scanf("%d",a+i);
}
sort(a,a+n);
int flag=1;
if(n&1){
cout<<"1"<<endl;
}
else{
for(int i=0;i<n-1;i+=2){
if(a[i]!=a[i+1]) {
flag=0;
break;
}
}
if(flag){
cout<<"0"<<endl;
}
else{
cout<<"1"<<endl;
}
}
}
return 0;
}
HDU1538海盗分金,找规律,当钱不够贿赂的时候考虑后面的人的心理,直接找规律,没有详细证明
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int a[20];
void ini(){
a[0]=2;
for(int i=1;i<18;i++)
a[i]=2*a[i-1];
return ;
}
int main(){
int T;
scanf("%d",&T);
ini();
while(T--){
int n,m,p;
scanf("%d%d%d",&n,&m,&p);
if(n<=2*m+1){
if(p==n){
cout<<m-(n-1)/2<<endl;
}
else if(abs(p-n)%2==0){
cout<<1<<endl;
}
else {
cout<<0<<endl;
}
}
else{
int flag=1;
for(int i=0;i<18;i++){
if(a[i]==n-m*2){
cout<<0<<endl;
flag=0;
break;
}
}
if(flag){
for(int i=0;i<18;i++){
if(n-m*2<a[i]){
if(p>m*2+a[i-1]&&p<m*2+a[i]){
cout<<"Thrown"<<endl;
}
else {
cout<<0<<endl;
}
break;
}
}
}
}
}
return 0;
}
基础博弈论,就先这些