HDU 5920 Ugly Problem(模拟)
来源:互联网 发布:初榨椰子油 知乎 编辑:程序博客网 时间:2024/06/07 08:46
这题思路比较简单,但是实现起来真的很烦……
比如一个数123456,先把它变成123321,剩下124,再变成121 和 3。
如果是654321,就先变成 653356 剩下的再递归。
特判一下10000000000这种情况,直接输出1和99999999999
这大概是我写过代码最长的模拟,撸了200多行……注意字符串手动剪切的话最后加个‘\0’;
【代码】
/* ***********************************************Author :angon************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <stack>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#define showtime fprintf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC)#define lld %I64d#define REP(i,k,n) for(int i=k;i<n;i++)#define REPP(i,k,n) for(int i=k;i<=n;i++)#define scan(d) scanf("%d",&d)#define scanl(d) scanf("%I64d",&d)#define scann(n,m) scanf("%d%d",&n,&m)#define scannl(n,m) scanf("%I64d%I64d",&n,&m)#define mst(a,k) memset(a,k,sizeof(a))#define LL long long#define N 1500#define mod 1000000007inline int read(){int s=0;char ch=getchar();for(; ch<'0'||ch>'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}struct Bignum{ char s[N];};int a[N],b[N],c[N];Bignum operator - (Bignum q, Bignum p){ Bignum ans; int la = strlen(q.s); int lb = strlen(p.s); mst(c,0);mst(a,0);mst(b,0); for(int i = 0;i<la;i++) a[i] = q.s[i] - '0'; for(int i = 0;i<lb;i++) b[i] = p.s[i] - '0'; for(int i = la-1,j=lb-1;i>=0;i--,j--) { if(j<0) { c[i] = a[i]; } if(a[i] >= b[j]) { c[i] = a[i] - b[j]; } else { a[i] += 10; a[i-1] -= 1; c[i] = a[i] - b[j]; } } int i = 0; while(c[i]==0) i++; mst(ans.s,0); int j; for(j=0;i<la;i++,j++) { ans.s[j] = c[i] + '0'; } ans.s[j] = '\0'; return ans;}bool operator >= (Bignum q,Bignum p){ int la = strlen(q.s); int lb = strlen(p.s); if(la>lb) return 1; if(la<lb) return 0; for(int i=0;i<la;i++) if(q.s[i]==p.s[i]){} else if(q.s[i]>p.s[i]) return 1; else if(q.s[i]<p.s[i]) return 0; return 1;}string ans[55];Bignum get_l(Bignum n){ Bignum q; mst(q.s,0); int len = strlen(n.s); int j,i; for(i=0,j=0;i<len/2;i++,j++) { q.s[j] = n.s[i]; } q.s[j] = '\0'; return q;}Bignum get_r(Bignum n){ Bignum q; mst(q.s,0); int len = strlen(n.s); int i,j; for(i=(len+1)/2,j=0;i<len;i++,j++) { q.s[j] = n.s[i]; } q.s[j] = '\0'; return q;}int num;void dfs(Bignum x){ int len = strlen(x.s); bool flag = 0; for(int i =0;i<len;i++) { if(x.s[i] != x.s[len - i -1]) { flag = 1; break; } } if(!flag) { ans[num++] = (string)x.s + '\0'; return ; } flag = 0; if(x.s[0] == '1') { for(int i=1;i<len;i++) if(x.s[i] != '0') { flag = 1; break; } if(!flag) { Bignum tmp ; strcpy(tmp.s ,"1"); ans[num++] = "1"; ans[num++] = (string)(x - tmp).s + '\0';; return ; } } if(len == 1) { if(x.s[0]!='0') ans[num++] = x.s; return ; } Bignum l = get_l(x); Bignum r = get_r(x); Bignum newl ; for(int i=len/2-1;i>=0;i--) { newl.s[len/2-1 - i] = l.s[i]; } if(r>=newl) { if(len & 1) { ans[num++] = (string)l.s + x.s[len/2] + (string)newl.s + '\0';; } else { ans[num++] = (string)l.s + (string)newl.s + '\0';; } //cout<< (r - newl).s<<endl; dfs(r - newl); } else { Bignum tmp1,tmp; strcpy(tmp1.s ,"1"); Bignum res = l - tmp1; mst(newl.s,0); for(int i=len/2-1;i>=0;i--) { newl.s[len/2-1 - i] = res.s[i]; } if(len & 1) { ans[num++] = (string)res.s + x.s[len/2] + (string)newl.s + '\0';; for(int i=0;i<len;i++) tmp.s[i] = ans[num-1][i]; tmp.s[len] = '\0'; } else { ans[num++] = (string)res.s + (string)newl.s + '\0';; for(int i=0;i<len;i++) tmp.s[i] = ans[num-1][i]; tmp.s[len] = '\0'; } Bignum tt = x - tmp; dfs(tt); }}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); Bignum n; int t,cas=1; scan(t); while(t--) { mst(n.s,0); cin>>n.s; REP(i,0,55) ans[i].clear(); num = 0; dfs(n); printf("Case #%d:\n",cas++); printf("%d\n",num); REP(i,0,num) cout<<ans[i]<<'\n'; } return 0;}
0 0
- HDU 5920 Ugly Problem(模拟)
- HDU 5920 Ugly Problem (大数模拟 构造回文串)
- HDU 5920 Ugly Problem(大数减法 模拟)
- HDU 5918 Ugly Problem(模拟)
- Hdu 5920 Ugly Problem
- HDU 5920Ugly Problem
- HDU 5920 Ugly Problem 【模拟】 (2016中国大学生程序设计竞赛(长春))
- HDOJ 5920 Ugly Problem 【模拟】
- hdu 5920 Ugly Problem(构造题)
- Ugly Problem(hdu 5920 && 2016ICPC长春现场赛模拟题)
- hdu 4920 Ugly Problem [模拟+大数减法]
- HDU5920 Ugly Problem (大模拟)
- hdu5920-Ugly Problem(强行模拟)
- hdu 5920 Ugly Problem(CCPC长春,构造回文数)
- HDU 5920 Ugly Problem (JAVA高精度+回文数)
- hdu 5920 Ugly Problem 字符串处理
- Ugly Problem HDU
- HDU5920 Ugly Problem(模拟,字符串)
- HDU 5918 Sequence I
- Convert Sorted List to Binary Search Tree
- Zabbix-3.0.3结合Grafana-3.1.0给你想要的绘图
- Ubuntu 16.04 - 64bit 下载 32位支持包
- HDU 5875 Function(简单线段树)
- HDU 5920 Ugly Problem(模拟)
- SDOI 2009 学校食堂
- 制作全新OS X EI Capitan安装U盘
- (坑)网络流24题
- android网络连接使用GET方式请求服务器时的setDoOutput(true)惹的祸
- 硬件串行接口总结
- Zabbix-3.0.3使用自带模板监控MySQL
- Codeforces Round #375 (Div. 2) D 连通块
- Android中Looper类