写代码要严谨:HDU-1172 猜数字/ 立方/..

/*

花了20分钟写完,改了整整两小时……

还是在zj告诉了我思路的情况下,_(:з」∠)_……(还好一遍A了,只能说给的样例好吧QAQ 要不真是要找死了)

(不过没看题解!hhh手工找错找死了)

题目的意思就是给你一个四位数,匹配数字“数”一样,数字位也一样的个数。

(比如3585和8555,数字一样有3,位数一样有2:5和5 吧)

题目是4位数,而且n不会超过100,基于一种对数字的敏感度,我们应该想到直接枚举

枚举的是什么呢?不要根据每一个n的选项枚举,操作很麻烦。

可以当做一次模拟,就是把所有的数跑一遍题目的意思,如果数通过了所有检验,那么数就是它想问的那个数。

但是过程似乎有一点点繁琐,由此就会有一些问题。所以说啊写代码要严谨,思路整理好

【错的时候应该先读读自己的程序,先排除一些显而易见的错误,当然如果能够手工模拟跑的过程就更好-】

(1)如何判断计数?

只有一个数符合的话才可以,所以如果最后计数有多个,就是0以及2以上都不行,检验结果只能是1

并且评判有n行,要每一个都满足才可以、

我是设置了ans1和ans2,满足ans1和ans2会得到ff++,最后ff==n才能拿到flag++

(当然flag只能有一个。。)

这些是属于细节的东西,整个思路理清楚的时候会觉得没有那么困难,下笔写的时候其实还需要具体细化(这种能力很重要)

(2)如何拿到四位数:我写的是

iii[1] = i / 1000;
iii[2] = (i - iii[1] * 1000) / 100;
iii[3] = (i - i/100*100) / 10;

iii[4] = i - i/10* 10;

反正吧最开始乱了,要i/100*100而不是用什么第二位直接巴拉巴拉

(3)我的思路是写两重for循环一一校验数字有没有一样的。。

头大。。continue没用,break又怕跳没了(break应该不会的。。。)

我就采取了 用过的设为-1的方法

但5和5 5 这样的就会匹配两次

于是我把用于匹配的初始5改成-2

结果又出现了匹配之前数字变掉的问题

 那么又加了一次重新计算得到i的每一位

(还是老问题,值变掉,,这个在bfs里貌似很常用)

(4)有关debug

这个时候就体会到中间输出和函数的奇妙作用了……

啊……可能…… 如果实在很麻烦,就写到函数里面找它的返回值吧

断点调试非常重要!……

(5)关于规范

还是把变量什么的都写到最上面去吧…… (?)

【赋初值的时候很容易乱】

【赋初值的时候很容易乱】

【赋初值的时候很容易乱】

【i和j一多也很容易乱 要多加警惕】
【i和j一多也很容易乱 要多加警惕】

emmm。。很多人都是一遍A,(很多!)基本样例能过来就没什么问题了,还是题目有点仁慈了啊。。

                                        18-7-11

                                        (这个日期。。距离我玩赛尔号已经9年了啊。。距离我玩贴吧也8年了)

*/

#include<stdlib.h>

#include<iostream>
using namespace std;
#define de(a,b) cout<<a<<" "<<b<<endl;
int main() {
	int n;
	while (cin >> n) {
		if (n == 0)return 0;
		int flag = 0;
		int record;
		int x[105] ;
		int y[105];
		int z[105];
		for (int i = 1; i <= n; i++)
			cin >> x[i] >> y[i] >> z[i];
		int iii[5]; int jjj[5];
		for (int i = 1000; i <= 9999; i++) { //i is every time the number
			//i = 3585;
			iii[1] = i / 1000;
			iii[2] = (i - iii[1] * 1000) / 100;
			iii[3] = (i - i/100*100) / 10;
			iii[4] = i - i/10* 10;
			//cout << iii[1] << iii[2] << iii[3] << iii[4] << endl;
			 int ff = 0;
			for (int j = 1; j <= n; j++) {
			//	x[j] = 8555, y[j] = 3, z[j] = 2;
				int ans1 = 0; int ans2 = 0;//先分解
				int xx = x[j];
				jjj[1] = xx / 1000;
				jjj[2] = (xx - jjj[1] * 1000) / 100;
				jjj[3] = (xx - xx/100* 100) / 10;
				jjj[4] = xx - xx / 10 * 10;
				//cout << jjj[1] << jjj[2] <<jjj[3] << jjj[4] << endl;
				//先比较y 
				for (int ii = 1; ii <= 4; ii++) {
					if (iii[ii] == jjj[ii])ans2++;
				}
				if (ans2 != z[j])continue;
				for (int ii = 1; ii <= 4; ii++)
				{
					for (int jj = 1; jj <= 4; jj++) {
						if (iii[ii] == jjj[jj]) {
							ans1++;
							jjj[jj] = -1;
							iii[ii] = -2;//continue;
						}
					}
				}
				iii[1] = i / 1000;
				iii[2] = (i - iii[1] * 1000) / 100;
				iii[3] = (i - i / 100 * 100) / 10;
				iii[4] = i - i / 10 * 10;
				if (ans1 != y[j])continue;
				if (ans1 == y[j] && ans2 == z[j]) { //cout << x[j]<<endl; 
				ff++; }
			}
			//cout << ans1 << ans2 << endl;
			if (ff==n) {
				//cout << ans1 << ans2 << endl;
				flag++;
				record = i;	
			}
		}
		if (flag == 1)cout << record << endl;
		else cout << "Not sure" << endl;
		system("color f0");
	}
	
	return 0;
}

 

【赋初值的时候很容易乱】

【赋初值的时候很容易乱】

【i和j一多也很容易乱 要多加警惕】

 

 

---不美观的后缀尾巴.....

【实现当然都是可以实现 可是没用啊】

【尽量简单】

【多思考 思考完了再下笔吧】

一个hin简单的题(中午还能学习的感觉真好啊感谢timing)

就是连着输出立方 三个立方这样  但是直接写有问题会有重复 那怎么办呢

而且利用输出过的数据 第一个数字一样的时候后面也有两个会不一样的。。。

 先打压没了不按顺序的,剩下的其实好办呀

别太复杂。。。  有的方法一看就是 T的飞起好不好  尤其吧 这个题也没让你想的那么复杂

200 200 200 200 4个加起来就16 8个0了  要简化 而不是再繁琐 好嘛

【现在看看简单  到时候就不一样了 摊手┓( ´∀` )┏】 循环优化

 

这题好水-.-  哭泣..   暴风哭泣.. 然后就是这两个时间其实没差-.-

#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
int pow(int x)
{
	return x*x*x;
}
int a, b, c,d;
int main() {
	for (int a = 6; a <= 200; a++) {
		for (int b = 2; b <= a; b++) {
			for (int c = b + 1; c <= a; c++) {
				if (b> c)continue;
				for (int d = c + 1; d <= a; d++) {
					if (c > d)continue;
					//if (pow(a) == pow(b) + pow(c) + pow(d))
					if (a*a*a == b * b*b + c * c*c + d * d*d)
					printf("Cube = %d, Triple = (%d,%d,%d)\n", a, b, c, d);
					//printf("Cube = %d,")
						//cout << a << b << c << d << endl;
				}
			}
		}
	}
		
		return 0;
}

..  在release下运行比在debug下快很多..  被抽特王嘲笑了-.0

还有 递归的数塔问题:(链接-HDU 2602-2084)

从下面往上回去就可以了,其实。

然后,想出这个是怎么走的,再把代码写一点。

写的很粗。。  所以数组还是开大一点,要么没用。。 什么的。



#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;

#define modd 998244353;
int dp[105][105];
int a[105][105];

int main() {
	int m; cin >> m;
	
	int n;
	while (m--) {
		cin >> n;
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= i; j++)cin >> a[i][j];
		}
		for (int i = 1; i <= n; i++)
			dp[n][i] = a[n][i];
	
		for (int i = n; i >= 1; i--)
		{
			for (int j = 1; j <= i; j++)
			{
				dp[i - 1][j] = max(dp[i][j], dp[i][j + 1])+a[i-1][j];
		}

		}cout << dp[1][1] << endl;
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值