Finals in arithmetic 分類討論

題意很簡單

但是寫起來比較麻煩,略噁心,建議先想清楚了再寫

大概思路

將數字按位從大到小爲1,,,n

兩種情況1和n的組合要不要最高位再次進位

l,r像中間走

cl,cr分別存是否向上一位進位,和下一位是否向前進位

然後xjb亂搞

還要注意0,18情況判斷,比較麻煩啦

還有最後靠攏的時候最中間相鄰的兩個數字的合法性判斷以及中間只有一個數字的時候應該是得到相同的數字相加

中間那部分靠攏的代碼一樣的直接拷貝就行

/*
ID: meixiny1
PROG: test
LANG: C++11
*/
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
#include <string>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#include <cctype>
using namespace std;
typedef long long ll;
typedef pair<int ,int> pii;
#define MEM(a,b) memset(a,b,sizeof a)
#define CLR(a) memset(a,0,sizeof a);
const int inf = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
#define PI 3.1415926535898
//#define LOCAL
int main()
{
#ifdef LOCAL
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	char s[100005];scanf("%s",s+1);
	int n = strlen(s+1);
	int a[100005],ans[100005];for(int i=1;i<=n;i++)a[i]=s[i]-'0';
	int ok = 0;
	int l = 1,r = n;
	int cl=0,cr=0;	
	if(a[1]==1){
		l++;
		if(l==r){
			if((10+a[l])%2==0){
				printf("%d",(10+a[r])/2);
				return 0;
			}
			else{
				goto end;
			}
		}
		if(a[l]+10==a[n]+10 && a[n]+10<=18)cl=0,cr=1,ans[l]=9,ans[r]=a[n]+1;
		else if(a[l]+10-1==a[n]+10 && a[n]+10<=18)cl=1,cr=1,ans[l]=9,ans[r]=a[n]+1;
		else if(a[l]+10-1==a[n])cl=1,cr=0,ans[l]=a[n]-1,ans[r]=1;
		else cl=-1;
		if(cl!=-1){
			l++,r--;
			while(l<=r){
				if(l==r){
					int res = cl*10+a[l]-cr;
					if(res <= 18 && res >= 0 && res%2==0)ans[l]=res/2,l++,r--;
					break;
				}
				if(cl*10+a[l]==a[r]-cr)ans[l]=a[r]-cr,ans[r]=0,cl=0,cr=0,l++,r--;
				else if(cl*10+a[l]-1==a[r]-cr && a[r]-cr>=0)ans[l]=a[r]-cr,ans[r]=0,cl=1,cr=0,l++,r--;
				else if(cl*10+a[l]==a[r]-cr+10 && cl*10+a[l]<=18)ans[l]=9,ans[r]=a[r]-cr+1,cl=0,cr=1,l++,r--;
				else if(cl*10+a[l]-1==a[r]-cr+10 && cl*10+a[l]-1>=0 && cl*10+a[l]-1<=18)ans[l]=9,ans[r]=a[r]-cr+1,cl=1,cr=1,l++,r--;
				else break;
			}
			if(((l-r==1 && cl==cr) || l-r==2) && ans[1]==0){
				for(int i=2;i<=n;i++)printf("%d",ans[i]);
				return 0;
			}
		}
	}
	MEM(ans,0);
	end:l=1,r=n;
	cl=0,cr=0;
	while(l<=r){
		if(l==r){
			int res = cl*10+a[l]-cr;
			if(res <= 18 && res >= 0 && res%2==0)ans[l]=res/2,l++,r--;
			break;
		}
		if(cl*10+a[l]==a[r]-cr)ans[l]=a[r]-cr,ans[r]=0,cl=0,cr=0,l++,r--;
		else if(cl*10+a[l]-1==a[r]-cr && a[r]-cr>=0)ans[l]=a[r]-cr,ans[r]=0,cl=1,cr=0,l++,r--;
		else if(cl*10+a[l]==a[r]-cr+10 && cl*10+a[l]<=18)ans[l]=9,ans[r]=a[r]-cr+1,cl=0,cr=1,l++,r--;
		else if(cl*10+a[l]-1==a[r]-cr+10 && cl*10+a[l]-1>=0 && cl*10+a[l]-1<=18)ans[l]=9,ans[r]=a[r]-cr+1,cl=1,cr=1,l++,r--;
		else break;
	}
	if(((l-r==1 && cl==cr) || l-r==2) && ans[1]){
		for(int i=1;i<=n;i++)printf("%d",ans[i]);
		return 0;
	}
	printf("0");
	return 0;
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章