【NOIP2009】提高组

T1潜伏者

题目链接

简单模拟题,没什么好讲的。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 char ch[102],yu[102],mi[102];
 5 int len1,len2,sum=0,len3,to[27],fr[27];
 6 int main(){
 7     scanf("%s",ch+1);
 8     len1=strlen(ch+1);
 9     scanf("%s",yu+1);
10     len2=strlen(yu+1);
11     scanf("%s",mi+1);
12     len3=strlen(mi+1);
13     if(len1!=len2)return printf("Failed"),0;
14     for(int i=1;i<=len1;i++){
15         int p=ch[i]-'A'+1,tt=yu[i]-'A'+1;
16         if(to[p]){
17             if(tt!=to[p])return printf("Failed"),0;
18             continue;
19         }
20         if(fr[tt]){
21             if(p!=fr[tt])return printf("Failed"),0;
22             continue;
23         }
24         sum++;to[p]=tt;fr[tt]=p;
25     }
26     if(sum!=26)return printf("Failed"),0;
27     for(int i=1;i<=len3;i++)
28         printf("%c",to[mi[i]-'A'+1]+'A'-1);
29     return 0;
30 }
T1

T2HankSon的趣味题

题目链接

题目就是求满足gcd(x,a0)=a1且lcm(x,b0)=b1的x的个数,如果把a0,a1,b0,b1分解质因数,即:

a0=p1k1+p2k2+...pnkn

a1=p1o1+p2o2+...pnon

b0=p1g1+p2g2+...pngn

b1=p1q1+p2q2+...pnqn

那么当k1==o1且g1==q1且o1<=q1时,x%p1o1-q1=0;--->ans*=o1-q1+1;

当(k1==o1&&g1==q1&&o1>q1)||(k1!=o1&&g1!=q1&&o1!=q1)时,无解。

那么就需要先筛一遍素数,因为>=5e4的素数最多只会在每个数中出现一次,所以只用筛到5e4就够了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 const int N=5e4+10;
 5 int read(){
 6     int ans=0,f=1;char c=getchar();
 7     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
 8     while(c>='0'&&c<='9'){ans=ans*10+c-48;c=getchar();}
 9     return ans*f;
10 }
11 int prime[50005],cnt=0,a0,a1,b0,b1;
12 bool ok[N];
13 void make_prime(){
14     ok[0]=ok[1]=1;
15     for(int i=2;i<=N-10;i++){
16         if(!ok[i])prime[++cnt]=i;
17         for(int j=1;j<=cnt&&i*prime[j]<=N-10;j++){
18             ok[i*prime[j]]=1;
19             if(i%prime[j]==0)break;
20         }
21     }
22 }
23 int sum;
24 void solve(int x){
25     int c0=0,c1=0,c2=0,c3=0;
26     while(a0%x==0){a0/=x;c0++;}
27     while(a1%x==0){a1/=x;c1++;}
28     while(b0%x==0){b0/=x;c2++;}
29     while(b1%x==0){b1/=x;c3++;}
30     if(c1==c0&&c2==c3){
31         if(c1>c3)sum=0;
32         else sum*=c3-c1+1;
33     }
34     else if(c1!=c0&&c2!=c3&&c1!=c3)sum=0;
35 }
36 int main(){
37     make_prime();
38     int tt=read();
39     while(tt--){
40         sum=1;
41         a0=read();a1=read();b0=read();b1=read();
42         for(int i=1;i<=cnt;i++){solve(prime[i]);if(!sum)break;}
43         if(b1>1)solve(b1);
44         printf("%d\n",sum);
45     }
46     return 0;
47 }
T2

T3最优贸易

题目链接

建正、反向边,边权为指向点的价格,跑两遍SPFA:

1.求每个点到终点最大值,表示从这个点出发到达终点可以卖出的最大价格;

2.求每个点到起点最小值,表示到这个点之前可以买到的最小价格。

最后枚举每个点求max即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define mem(a,p) memset(a,p,sizeof(a))
 5 const int M=1e6+10,N=1e5+10;
 6 int n,m,first[N],wi[N],dis[N],fir[N],tot=0,sum=0,q[N],di[N];
 7 bool ok[N];
 8 struct node{int ne,to;}e[M],tt[M]; 
 9 int min(int x,int y){return x>y?y:x;}
10 int max(int x,int y){return x>y?x:y;}
11 int read(){
12     int ans=0,f=1;char c=getchar();
13     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
14     while(c>='0'&&c<='9'){ans=ans*10+c-48;c=getchar();}
15     return ans*f;
16 }
17 void ins(int u,int v){e[++tot]=(node){first[u],v};first[u]=tot;}
18 void inss(int u,int v){tt[++sum]=(node){fir[u],v};fir[u]=sum;}
19 void spfa(int p){
20     ok[n]=1;int h=0,t=1;
21     if(!p)dis[n]=wi[n],q[0]=n;
22     else di[1]=wi[1],q[0]=1;
23     while(h!=t){
24         int x=q[h++];if(h>=n)h=0;
25         if(p){
26             for(int i=first[x];i;i=e[i].ne){
27                 int to=e[i].to;
28                 int mx=min(di[x],wi[to]);
29                 if(di[to]>mx){
30                     di[to]=mx;
31                     if(!ok[to]){
32                         ok[to]=1;q[t]=to;
33                         if(di[to]<di[q[h]])std::swap(q[h],q[t]);
34                         t++;if(t>=n)t=0;
35                     }
36                 }
37             }
38         }
39         else{
40             for(int i=fir[x];i;i=tt[i].ne){
41                 int to=tt[i].to;
42                 int mx=max(dis[x],wi[to]);
43                 if(dis[to]<mx){
44                     dis[to]=mx;
45                     if(!ok[to]){
46                         ok[to]=1;q[t]=to;
47                         if(dis[to]>dis[q[h]])std::swap(q[h],q[t]);
48                         t++;if(t>=n)t=0;
49                     }
50                 }
51             }
52         }
53         ok[x]=0;
54     }
55 }
56 int main(){
57     n=read();m=read();
58     for(int i=1;i<=n;i++)wi[i]=read();
59     for(int i=1,a,b,z;i<=m;i++){
60         a=read();b=read();z=read();
61         ins(a,b);inss(b,a);
62         if(z-1)ins(b,a),inss(a,b);
63     }
64     mem(di,127);
65     spfa(0);
66     spfa(1);
67     int mx=0;
68     for(int i=1;i<=n;i++){
69         int p=dis[i]-di[i];
70         mx=max(p,mx);
71     }
72     printf("%d",mx);
73     return 0;
74 }
T3

T4靶形数独

题目链接

懒得写......本来是打算学一波DLX再来写的,但是看起来没什么时间了就弃坑吧......->v->

posted @ 2017-11-05 20:25  Child-Single  阅读(371)  评论(0编辑  收藏  举报