/*
花了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;
}