今天的考试,其实至少应该得到180分的,可是我却爆零了,的确还是很不开心的。
刚拿到题,我先读了一遍,觉得第一,三题大概可以暴力骗点分,而第二题则应该是用某种玄学的排序方式A掉,于是就先开始打暴力解法。然而,两道题都在写到一半的时候,想出了一些玄学的毒瘤优化,就不假思索地加了上去,结果这两个优化却都不优美,我都多多少少没想到一些东西,于是就完美的丢掉了130分。考完之后的我听了 川大附小三年级四班 的易健驰的讲解恍然大悟,惊呼“毒瘤优化不可取!”,觉得十分的难过,因为自己没有认真考虑,而导致丢分,这对于我这种零基础选手是万万不可的,以后一定要杜绝这种感觉写出来了就洋洋得意,不知所措,乱加优化的毛病。
在我加完了毒瘤优化之后,时间已经只剩不到一个小时,这使我十分的慌乱,想要大呼苟利国家生死以以来增加写题速度,就赶快开始打第二题。可是即使这样我也是能得50分的。不巧的是,我把所有的“Yes”和“No”都写成了“YES”和“NO”,也让我最终爆零。
总结经验,继往开来,作为一个零基础选手,我要时刻戒骄戒躁,一定不能太得意,但同时也要充满信心,相信简单题随便做才是拉开差距最主要的因素,争取今年noip一等奖。
另外,我虽然思维灵活,可是有时比一定能考虑完全,这周做虫食算的时候也没有考虑完所有的因素,才让我卡了十几分钟,因此我更要发展我的思维,并熟练自己的代码能力。
洛谷1092 虫食算
题目 首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。
其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们 就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1)。输入数据保证N个字母分别至少出现一 次。
输入格式:
包含四行。第一行有一个正整数N(N<=26),后面的3行每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低 位,并且恰好有N位。
输出格式:包含一行。在这一行中,应当包含唯一的那组解。解是这样表示的:输出N个数字,分别表示A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不能有多余 的空格。
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
//题解? tan90
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
int n,a[30];
char s[4][30];
bool vis[30];
int change(char c) {return c-'A'+1;}
void dfs(int h,int l,int jin) { // 行 // 列 // 进位 //从上到下,从右到左dfs
if(l==0) { //扫完了
if(jin==0) {
for(int i=1; i<=n; i++)printf("%d ", a[i]);
exit(0);
}
return;
}
for(int i=l-1; i>=1; i--) { //剪枝
int jia1=a[change(s[1][i])];
int jia2=a[change(s[2][i])];
int he=a[change(s[3][i])];
if(jia1==-1||jia2==-1||he==-1) continue;
if((jia1+jia2)%n!=he&&(jia1+jia2+1)%n!=he) return;
}
if(a[change(s[h][l])]!=-1) {
if(h!=3)dfs(h+1,l,jin);
else {
int he=a[change(s[1][l])]+a[change(s[2][l])]+jin;
if(he%n!=a[change(s[3][l])])return;
dfs(1,l-1,he/n);
}
} else {
for(int i=n-1;i>=0;i--){//枚举这一位的数
if(!vis[i]){
if(h==3){
int he=a[change(s[1][l])]+a[change(s[2][l])]+jin;
if(he%n!=i)continue;
vis[i]=1;a[change(s[3][l])]=i;//赋值,标记这个数用过
dfs(1,l-1,he/n);
vis[i]=0;a[change(s[3][l])]=-1;//赋值,标记这个数用过
}
else {
a[change(s[h][l])]=i;vis[i]=1;
dfs(h+1,l,jin);
a[change(s[h][l])]=-1;vis[i]=0;
}
}
}
}
}
int main() {
scanf("%d", &n);
for(int i=1; i<=3; i++) scanf("%s", &s[i]+1);
memset(a,-1,sizeof(a));
dfs(n,1,0);
return 0;
}