zoukankan      html  css  js  c++  java
  • 【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
    ",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->

  • 相关阅读:
    《挑战程序设计竞赛》 读后感
    基于SOAP的xml网络交互心得
    不用客户端,轻松下视频
    在cmd窗口中查询android的sqlite3数据库表之步骤
    单链表的插入删除以及逆转
    java中排序一个字符串数组
    求质因数
    指针与引用的区别
    统计查询-sql
    ---随心买统计查询
  • 原文地址:https://www.cnblogs.com/JKAI/p/7788569.html
Copyright © 2011-2022 走看看