列表

详情


NC21875. 牛牛玩石头

描述

牛牛正在玩三堆石头,一开始每堆石头分别有A B C个石头,牛牛的目的是将每堆石头的数量变成一样的
牛牛可以进行0次或者多次操作,为了增大点难度,牛牛每次操作可以选择两堆数量不同的石头,假设数量分别为x,y, (x < y)
然后,牛牛会将两堆石头的数量变成 (x + x) 与 (y - x)

问你牛牛能否将三堆石头变成一样的数量

输入描述

输入一行包含三个整数

输出描述

如果可以输出"possible"

否则输出"impossible"

示例1

输入:

10 15 35

输出:

possible

示例2

输入:

1 1 2

输出:

impossible

示例3

输入:

4 6 8

输出:

impossible

原站题解

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

C++14(g++5.4) 解法, 执行用时: 9ms, 内存消耗: 508K, 提交时间: 2019-10-10 16:54:39

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+200;

int main()
{
	int a,b,c;
	cin>>a>>b>>c;
	for(int i=1;i<=maxn;i++)
	{
		int r=rand()%3;
		if(a<b) swap(a,b);
		if(a<c) swap(a,c);
		if(b<c) swap(b,c);
		if(a>b&&r==0) a-=b,b+=b;
		if(a>c&&r==1) a-=c,c+=c;
		if(b>c&&r==2) b-=c,c+=c;
		if(a==b&&b==c) break;
	}
	if(a==b&&b==c) cout<<"possible"<<endl;
	else cout<<"impossible"<<endl;  
	
}

C 解法, 执行用时: 13ms, 内存消耗: 476K, 提交时间: 2021-06-08 17:12:29

#include<stdio.h>

const int maxn=100;
 
int main()
{
    int a,b,c,t;
    scanf("%d%d%d",&a,&b,&c);
    for(int i=1;i<=maxn;i++)
    {
        if(a<b) t=a,a=b,b=t;
        if(a<c) t=a,a=c,c=t;
        if(b<c) t=c,c=b,b=t;
        if(b>c) b-=c,c+=c;
        if(a>b) a-=b,b+=b; 
        if(a==b&&b==c) break;
    }
    if(a==b&&b==c) printf("possible\n");
    else printf("impossible\n");
     
}

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 504K, 提交时间: 2019-10-10 18:50:58

#include<bits/stdc++.h>
#define rep(i,s,e) for(int i=s; i<e; ++i)
using namespace std;
int main(){
	int a,b,c; cin>>a>>b>>c; rep(i,0,100){
		if(a<b) swap(a,b); if(a<c) swap(a,c); if(b<c) swap(b,c);
		if(b>c) b-=c,c+=c; if(a>b) a-=b,b+=b;
		if(a==b&&b==c) return puts("possible"),0;
	} return puts("impossible"),0;
}

上一题