21行代码AC——例题5-2 Ducci序列(Ducci Sequence,UVa1594)——解题报告

励志用少的代码做高效的表达。


题目(提交)链接→UVa-1594


本题为水题,因此侧重点从解题转变为优化。

注意点:

1、下一轮是按照上一轮的每个数做运算,但下一轮每次运算都会改变数列的值,造成运算不准确,我的做法是:事先拷贝一个数列b,用数列b的值做运算,而后赋值给a。
2、我判断0序列的方法是:用#include<algorithm>中的count()函数,如果0的数量等于数组长度,则输出zero。循环直接结束。这样可以避免出现全为0仍然继续运算的情况。提高效率

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n; cin >> n; while(n--) {				//n是序列个数 
		int m; cin >> m; 						//m是序列中元素数 
		int a[m+1], b[m+1]; memset(a,0,sizeof(a)); memset(b,0,sizeof(b));		//a[m]存储元素,b[m]做拷贝 ,从1开始好循环 
		for(int i = 1; i <= m; i++) { cin >> a[i] ; b[i] = a[i]; }	//输入a序列,拷贝b序列
		int num = 0;
		while(num++ < 1000) {					//满1000次退出循环 
			for(int i = 1; i <= m; i++) 
				a[i] = abs(b[i]-b[(i+m)%m+1]);	//取余。求绝对值 
			memcpy(b,a,sizeof(a));				//赋值 
			if(count(a+1,a+m+1,0) == m) {		//如果0在a中的个数=m,则说明全部置0。 
				cout << "ZERO" << endl;
				break;
			}
		}
		if(num == 1001) cout << "LOOP" <<endl;	//若遍历满1000次,说明是循环。 
	}
	return 0;
} 

日拱一卒,功不唐捐。

发布了79 篇原创文章 · 获赞 72 · 访问量 7164

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/104766952
今日推荐