UVa 1583 Digit Generator --- 水题+打表
2016-03-24 01:47
323 查看
UVa 1583
题目大意:如果x加上x的各个数字之和得到y,那么称x是y的生成元。
给定数字n,求它的最小生成元
解题思路:可以利用打表的方法,提前计算出以i为生成元的数,设为d,并保存在a[d]中(a[d]=i),反复枚举,若是初次遇到或遇到更小的则更新
相关说明:本来按书上来,在更新数组a时,if里是有或上 i < a[y]这个条件的,
但观察到由于i是从小到大枚举的,因此只会更新一次,即第一次填进去的就是最小生成元,因此去掉仍然AC
View Code
题目大意:如果x加上x的各个数字之和得到y,那么称x是y的生成元。
给定数字n,求它的最小生成元
解题思路:可以利用打表的方法,提前计算出以i为生成元的数,设为d,并保存在a[d]中(a[d]=i),反复枚举,若是初次遇到或遇到更小的则更新
相关说明:本来按书上来,在更新数组a时,if里是有或上 i < a[y]这个条件的,
但观察到由于i是从小到大枚举的,因此只会更新一次,即第一次填进去的就是最小生成元,因此去掉仍然AC
/* UVa 1583 Digit Generator --- 水题+打表 */ #include <cstdio> #include <cstring> const int maxn = 100005; int a[maxn]; //a[i]的值表示i的最小生成元是a[i] int main() { memset(a, 0, sizeof a); for (int i = 1; i < maxn; ++i){ int x = i, y = i; //通过i并类加上各位置的和得到y,因而i是y的生成元 a[y] = i; while (x){ y += x % 10; x /= 10; } //i是y的生成元 由i--->y的 //若是第一次算出y 或者 当前生成元比以前的更小 则更新 //本来按书上来if里是有或上 i < a[y]这个条件的 //但是由于i是从小到大枚举的 因此只会更新一次 即第一次填进去的就是最小生成元 因此去掉仍然AC if (a[y] == 0){ // || i < a[y] a[y] = i; } }//for(i) int t, n; scanf("%d", &t); while (t--){ //打完表后每次读取便可 scanf("%d", &n); printf("%d\n", a ); }//while(t) return 0; }
View Code
相关文章推荐
- 墙裂推荐4款js网页烟花特效
- Block实现-block存储域
- RGBD物体识别(1)--开篇
- Apache的Order Allow,Deny 规则
- 二分查找法,查询指定的值
- 一种生成当中帧技术,异步时间扭曲(Asynchronous Timewarp)
- 两种实现选项卡功能----自定义和TabLayout
- django 的数据库操作
- Aidl 实现进程之间的通讯
- 作业3:PSP记录耗时情况
- 前置++与后置++之一道简单的题目引发的思考
- 批量解决Xcode更新后,插件过期问题
- android学习——判断APP(程序)是否第一次启动
- Netty系列之Netty线程模型
- UVa 1584 Circular Sequence --- 水题
- 安装聊天软件telegram-cli
- 癌症有克星了吗?
- Android学习之仿QQ侧滑功能的实现
- [3783]:ZOJ
- 作业3:是否需要有代码规范