Noip2009的题目还是有一定难度的,主要是搜索和最短路都是我的弱项,不检查第一遍下来只做了150分,还是这句话,素质和读题的仔细程度决定了分数。仔细想想,我们化学老师说的话没错,或许题目你都会做,但是你在考试时犯下的各种错误终将导致你的失败,所以,提高个人编程的素质,对于我来说才是目前最重要的事。

T1:潜伏者

  第一题是极简单的字符串操作题,读题仔细一点,注意各种规则即可AC,但是在做的时候自己犯了一点小错误,结果只有90分,这是不应该的!

#include <cstdio>
#include <cstring>
char s1[105],s2[105],w[105];
int hash[26],flag[26],ap[26];
int main(){
scanf("%s",s1); scanf("%s",s2);
for(int i=0;i<strlen(s1);i++){
if(ap[s1[i]-'A']==1&&hash[s1[i]-'A']!=s2[i]-'A'){puts("Failed");return 0;}
ap[s1[i]-'A']=1;
hash[s1[i]-'A']=s2[i]-'A';
}
for(int i=0;i<26;i++)if(!ap[i]){puts("Failed");return 0;}
for(int i=0;i<26;i++){
if(flag[hash[i]]){puts("Failed");return 0;}
flag[hash[i]]=1;
}
scanf("%s",w);
for(int i=0;i<strlen(w);i++)printf("%c",(char)(hash[w[i]-'A']+(int)'A'));
return 0;
}

T2:Hankson的趣味题  

  第一遍用暴力,拿了六十分,看了网上的题解,需要素数分解,然后是一些比较复杂的范围求解,个人感觉没必要,然后尝试了一下只枚举sqrt(n),且判断是否是约数,如果是进行一次计算,并计算其对应的相乘为n的数是否成立,否则continue,然后神奇般地AC了,所以有时候没必要想得太过复杂,认真思考,或许最简单的方法才是最有效的。

#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
void init(int &x){
char c;
while(c=getchar(),c<'0'||c>'9'); x=c-'0';
while(c=getchar(),c>='0'&&c<='9')x=x*10+c-'0';
}
int gcd(int x,int y){return y==0?x:gcd(y,x%y);}
int lcm(int x,int y){return x/gcd(x,y)*y;}
int main(){
int T,a0,a1,b0,b1;
scanf("%d",&T);
while(T--){
int cnt=0;
init(a0);init(a1);init(b0);init(b1);
int k=sqrt(b1);
for(int i=1;i<=k;i++){
if(b1%i!=0)continue;
if(gcd(i,a0)==a1&&lcm(i,b0)==b1)cnt++;
int tmp=b1/i;
if(tmp!=i&&gcd(tmp,a0)==a1&&lcm(tmp,b0)==b1)cnt++;
}
printf("%d\n",cnt);
}
return 0;
}

T3:最优贸易  

  想得过于复杂,结果码不出程序,暴力拿了0分,汀神说最短路就好啦,然后醒悟,正向建图SPFA一遍求到某点路上的最小值,反向建图同理求得从终点到此处的最大值,然后枚举每一个点进行计算比较一下即可。

#include <cstdio>
#define Q_MAX 100000
int m1[1000005],next1[1000005],end1,head1[100005];
int m2[1000005],next2[1000005],end2,head2[100005];
int num[100005],used[100005],Q[Q_MAX],h,r;
int min[100005],max[100005];
void add1(int a,int b){m1[end1]=b;next1[end1]=head1[a];head1[a]=end1++;}
void add2(int a,int b){m2[end2]=b;next2[end2]=head2[a];head2[a]=end2++;}
void Q_push(int k){
if(used[k]){return;}
used[k]=1; Q[r]=k;
r=(r+1)%Q_MAX;
}
int Q_pop(void){
int t=Q[h];
used[t]=0;
h=(h+1)%Q_MAX;
return t;
}
int main(){
int i,j,n,m,a,b,c;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++){
head1[i]=head2[i]=-1;
max[i]=-1000000;
min[i]=1000000;
scanf("%d",&num[i]);
}
for(i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
a--,b--;
if(c==2){
add1(a,b); add1(b,a);
add2(a,b); add2(b,a);
}else add1(a,b),add2(b,a);
}
min[0]=num[0];
Q_push(0);
while(h!=r){
i=Q_pop();
for(a=head1[i];a!=-1;a=next1[a]){
j=m1[a];
if(min[j]>min[i])min[j]=min[i],Q_push(j);
if(min[j]>num[j])min[j]=num[j],Q_push(j);
}
}
max[n-1]=num[n-1];
Q_push(n-1);
while(h!=r){
i=Q_pop();
for(a=head2[i];a!=-1;a=next2[a]){
j=m2[a];
if(max[j]<max[i])max[j]=max[i],Q_push(j);
if(max[j]<num[j])max[j]=num[j],Q_push(j);
}
}
for(i=a=0;i<n;i++)if(a<max[i]-min[i])a=max[i]-min[i];
printf("%d\n",a);
return 0;
}

T4:靶形数独  

   这道题的搜索很巧妙,如果直接搜索判重过于复杂而且会超时,想想八皇后的位运算搜索方法,应用在这道题上刚好,而且简化许多,用hs,ss表示横排,竖排上已有的数字,用nine表示每个小方格中已有的数字,而h表示该处是否被占据,然后就用lowbit计算低位空,依次进行dfs,每当k=10即搜索完成时更新最大值即可。

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int a[10][10],h[10],hs[10],ss[10],nine[10],hash[10],q[10],ans=-1,st=511;
int ten(int x){return (int)log2(x)+1;}
void f(){
int c=a[5][5]*10;
for(int k=2;k<=5;k++){
for(int i=k;i<=10-k;i++)c+=(4+k)*(a[i][k-1]+a[i][11-k]);
for(int j=k;j<=10-k;j++)c+=(4+k)*(a[k-1][j]+a[11-k][j]);
c+=(4+k)*(a[k-1][k-1]+a[k-1][11-k]+a[11-k][k-1]+a[11-k][11-k]);
}
if(c>ans)ans=c;
}
void dfs(int k){
if(k==10)f();
else{
int i=hash[k],j,get,num,pos,p;
pos=st&~h[i]; p=pos&-pos;
h[i]|=p; j=ten(p);
get=st&~(hs[i]|ss[j]|nine[(i-1)/3*3+(j-1)/3+1]);
while(get){
num=get&-get;
get^=num;
a[i][j]=ten(num);
hs[i]|=num; ss[j]|=num;
nine[(i-1)/3*3+(j-1)/3+1]|=num;
if(pos==p)dfs(k+1); else dfs(k);
hs[i]^=num; ss[j]^=num;
nine[(i-1)/3*3+(j-1)/3+1]^=num;
}h[i]^=p;
}
}
int main(){
int k=1;
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++){
hash[i]=i;
scanf("%d",&a[i][j]);
if(a[i][j]){
h[i]|=1<<(j-1);
if(((hs[i]|ss[j]|nine[(i-1)/3*3+(j-1)/3+1])&(1<<(a[i][j]-1)))==1){printf("-1\n");return 0;}
hs[i]|=1<<(a[i][j]-1);
ss[j]|=1<<(a[i][j]-1);
nine[(i-1)/3*3+(j-1)/3+1]|=1<<(a[i][j]-1);
}else q[i]++;
}
for(int i=1;i<9;i++)for(int j=i+1;j<=9;j++)
if(q[hash[i]]>q[hash[j]])swap(hash[i],hash[j]);
while(q[hash[k]]==0)k++;dfs(k);
printf("%d\n",ans);
return 0;
}

注意点:

  1.最短路的几种算法都要熟悉起来,并且要可以很快码出来;

  2.对于位置搜索优化时可以考虑位运算;

3.读题一定要清楚仔细,宁愿多花几分钟,也不要因读错题走冤枉路;

  4.循环队列记得进队出队都要取模。

Noip2009提高组总结的更多相关文章

  1. 洛谷 P1073 最优贸易 & [NOIP2009提高组](反向最短路)

    传送门 解题思路 很长的题,实际上在一个有向图(点有点权)中求一个从起点1到终点n的路径,使得这条路径上点权最大的点与点权最小的点的差值最大(要求必须从点权较小的点能够走到点权较大的点). ——最短路 ...

  2. [NOIP2009] 提高组 洛谷P1073 最优贸易

    题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...

  3. [NOIP2009] 提高组 洛谷P1071 潜伏者

    题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原 ...

  4. [NOIP2009] 提高组 洛谷P1074 靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  5. [NOIP2009] 提高组 洛谷P1072 Hankson 的趣味题

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...

  6. noip2009提高组解题报告

    NOIP2009潜伏者 题目描述 R 国和S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动. 历尽艰险后,潜伏于 S 国的R 国间谍小C 终于摸清了S 国军用密码的编码规则: 1. S 国 ...

  7. noip2009提高组题解

    NOIP2009题解 T1:潜伏者 题目大意:给出一段密文和破译后的明文,一个字母对应一个密文字母,要求破译一段密文,如果有矛盾或有未出现密文无法破译输出failed,否则输出明文. 思路:纯模拟题 ...

  8. NOIP2009 提高组T3 机器翻译 解题报告-S.B.S

    题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先 ...

  9. 【NOIP2009提高组】最优贸易

    https://www.luogu.org/problem/show?pid=1073 如果他想在i点卖出,那么就要在从1点出发到i点的路径里找个最便宜的买入,用Bellman-Ford求出这样最便宜 ...

随机推荐

  1. hadoop之hdfs学习

    简介 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的.论文为GFS(Google File System)Go ...

  2. (Problem 19)Counting Sundays

    You are given the following information, but you may prefer to do some research for yourself. 1 Jan ...

  3. (Problem 40)Champernowne's constant

    An irrational decimal fraction is created by concatenating the positive integers: 0.1234567891011213 ...

  4. 《Orange'S:一个操作系统的实现》笔记(一)

    感觉自己对于操作系统始终没有一个清楚的概念,尤其最近困扰于实模式.保护模式以及寻址方式等一些概念.转而一想,所有的程序,最终都是操作的计算机资源,需要和操作系统打交道,所以操作系统有必要深入了解一下. ...

  5. 为过程或函数sp_Adduser指定了过多的参数

    前些天写用户注册模块,用存储过程添加用户,一开始就报“为过程或函数sp_Adduser指定了过多的参数”.仔细检查数据层的用户添加函数,结果在为存储过程添加sqlparameter参数的时候,数组给写 ...

  6. [转贴]JavaScript中Array(数组)的属性和方法

    数组有四种定义的方式 使用构造函数:var a = new Array();var b = new Array(8); var c = new Array("first", &qu ...

  7. php执行shell更新svn文件的方法

    vim /etc/sudoers 修改内容如下: #Defaults !visiblepw Defaults visiblepw #Defaults requiretty <?php set_t ...

  8. poj 2228 Naptime dp

    这个题目的状态还是比较好想的,dp[i][j]表示已经睡了i个时段,最后睡在j时段的最优值,但是需要处理环的情况,我的做法是算两次,第一次不处理环,第二次强制性要求第一个时段需要睡,然后查看dp[m] ...

  9. Cocos2d-x:环境配置小节

    一.准备 须要下载下面内容. 1. vs2010 下载地址:http://download.microsoft.com/download/1/4/3/143B7583-6225-474F-88D5-5 ...

  10. android UI跨线程操作

    android应用程序也是单线程程序,主线程为UI线程. android 线程是非安全的,即不要在子线程中更新 UI. public class MasterActivity extends Acti ...