13 条题解
-
1
stcdalyc LV 10 @ 2 年前
看了一下没人发题解,我发一个我的做法。
#1 Accepted 82ms 6.867 MiB
#2 Accepted 6ms 640.0 KiB
#3 Accepted 5ms 896.0 KiB
#4 Accepted 8ms 1.0 MiB
#5 Accepted 9ms 2.0 MiB
#6 Accepted 9ms 2.875 MiB
#7 Accepted 30ms 3.625 MiB
#8 Accepted 20ms 5.125 MiB
#9 Accepted 24ms 6.125 MiB
#10 Accepted 47ms 6.875 MiB主要思路是动态规划,我的代码是记忆化搜索。 根据长度来设定状态,每个状态记录当下所至少使用的 ADD DEL MOVE。
-
04 年前@
/*这个解过了题目举的两个例子,但测试一个都没过,很无语不知道为什么*/
#include <stdio.h>
int count(int num) {
int c = 0;
while (num != 0) {
c += num % 2;
num /= 2;
}
return c;
}int getSevenRepresent(int num) {
switch(num) {
case 0:
return 119; //0b1110111;
case 1:
return 18; //0b0010010;
case 2:
return 93; //0b1011101;
case 3:
return 91; //0b1011011;
case 4:
return 58; //0b0111010;
case 5:
return 107; //0b1101011;
case 6:
return 111; //0b1101111;
case 7:
return 82; //0b1010010;
case 8:
return 127; //0b1111111;
case 9:
return 123; //0b1111011;
default:
fprintf(stderr, "getSevenRepresent: value %d not a digit", num);
return 0;
}
}void getdiff(int leftNum, int rightNum, int *leftRm, int *leftAdd, int digit) {
int leftDigit, rightDigit;
for (int i=0;i<digit; i++) {
leftDigit = getSevenRepresent(leftNum % 10);
rightDigit = getSevenRepresent(rightNum % 10);
*leftRm += count(leftDigit & ~rightDigit);
*leftAdd += count(~leftDigit & rightDigit);leftNum /= 10;
rightNum /= 10;
}
}int main(void) {
int digit = 0;
int leftNum = 0, rightNum = 0;
int p[3], q[3];
scanf("%d", &digit);
scanf("%d", &leftNum);
scanf("%d", &rightNum);
for (int i=0;i<3;i++) {
scanf("%d", &p[i]);
scanf("%d", &q[i]);
}int leftRm = 0, leftAdd = 0;
getdiff(leftNum, rightNum, &leftRm, &leftAdd, digit);
int result = 0, rm = 1, add = 1, mov = 1;// printf("leftRm = %d\n", leftRm);
// printf("leftAdd = %d\n", leftAdd);while (leftRm != 0 || leftAdd != 0) {
int movCost = p[2] * mov + q[2],
addCost = p[0] * add + q[0],
rmCost = p[1] * rm + q[1];if (movCost < (addCost + rmCost) &&
leftRm != 0 && leftAdd != 0) {
result += (p[2] * mov + q[2]);
leftAdd--;
leftRm--;
mov++;
} else if (leftAdd == 0 || rmCost < addCost) {
result += (p[1] * rm + q[1]);
leftRm--;
rm++;
} else {
result += (p[0] * add + q[0]);
leftAdd--;
add++;
}
// printf("result = %d\n", result);
// printf("leftRm = %d\n", leftRm);
// printf("leftAdd = %d\n", leftAdd);
}
printf("%d", result);
} -
-13 年前@
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,怎么这么难~~
-
-48 年前@
var a,b:longint;
begin
read(a,b);
write(a+b);
end. -
-59 年前@
虽然我没有AC但我来抢个沙发
-
-68 年前@
-
-68 年前@
-
-68 年前@
-
-68 年前@
-
-68 年前@
*This is *
vijos!!! -
-68 年前@
hfhsgfdagajsgasga
-
-68 年前@
hjdg
- 1
信息
- ID
- 1854
- 难度
- 7
- 分类
- (无)
- 标签
- 递交数
- 78
- 已通过
- 16
- 通过率
- 21%
- 被复制
- 1
- 上传者