• NOIP 2013 提高组 Day1


    题目:http://wenku.baidu.com/link?url=WgP-2UcEJy53ShbZC3gQVHZTXrHbgg14COe3HE9ybEfI82sr8nMvc-FobNBS9WwQxCEiCtb3TdETK-ZD3i3F1lMOqq3-J1cfkTrfhrbXLJe

    1.转圈游戏

    [快速幂]

      注意:二分时记得保存值,不可重复运算;

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<algorithm>
     5 #include<cstring>
     6 using namespace std;
     7 int n,m,k,x;
     8 int ans;
     9 int PM(int a, int b, int c)
    10 {
    11     int ans=1;
    12     a=a%c;
    13     while(b>0)
    14     {
    15         if(b%2==1)
    16         ans=(ans*a)%c;
    17         b= b/2;
    18         a=(a*a)%c;
    19     }
    20     return ans;
    21 }
    22 int main()
    23 {
    24     freopen("circle.in","r",stdin);
    25     freopen("circle.out","w",stdout);
    26     cin>>n>>m>>k>>x;
    27     ans=PM(10,k,n);
    28     cout<<(x+ans*m)%n;
    29     return 0;
    30 }

    2.火柴排队

    [归并排序][逆序对]

      提示:还可以用树状数组和线段树;

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<algorithm>
     5 #include<cstring>
     6 using namespace std;
     7 int  ans;
     8 struct poin{
     9     int num;
    10     int s;
    11 }q[100005];
    12 poin w[100005];
    13 int com(const poin &a,const poin &b)
    14 {
    15     if(a.s<b.s)return 1;
    16     return 0;
    17 }
    18 int n;
    19 int a[100005],r[100005];
    20 void mergesort(int s,int t)
    21 {
    22     if(s==t)return ;
    23     int m=(s+t)>>1;
    24     mergesort(s,m);
    25     mergesort(m+1,t);
    26     int i=s;
    27     int j=m+1;
    28     int k=s;
    29     while(i<=m&&j<=t)
    30     {
    31         if(a[i]<=a[j])
    32         {
    33             r[k++]=a[i++];
    34         }
    35         else
    36         {
    37             ans=(ans+m-i+1)%99999997;
    38             r[k++]=a[j++]; 
    39         }
    40     }
    41     while(i<=m)
    42         r[k++]=a[i++];
    43     while(j<=t)
    44         r[k++]=a[j++];
    45     for(int i=s;i<=t;i++)
    46         a[i]=r[i];
    47 }
    48 int main()
    49 {
    50     freopen("match.in","r",stdin);
    51     freopen("match.out","w",stdout);
    52     cin>>n;
    53     for(int i=1;i<=n;i++)
    54     {
    55         scanf("%d",&q[i].s);
    56         q[i].num=i;
    57     }
    58     for(int j=1;j<=n;j++)
    59     {
    60         scanf("%d",&w[j].s);
    61         w[j].num=j;
    62     }
    63     sort(q+1,q+1+n,com);
    64     sort(w+1,w+1+n,com);
    65     for(int i=1;i<=n;i++)
    66     a[w[i].num]=q[i].num;
    67     mergesort(1,n);
    68     cout<<ans;
    69     return 0;
    70 }

    3.货车运输

    [不会][60分][并查集]

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 using namespace std;
     5 int father[10001];
     6 int n,q,tot,m;
     7 struct xx{
     8     int x,y,w;
     9 }bian[50005];
    10 int find(int x)//
    11 {
    12     if(father[x]!=x) father[x]=find(father[x]);
    13     return father[x];
    14 }
    15 void unionn(int a,int b)//
    16 {
    17     int fa=find(a);
    18     int fb=find(b);
    19     if(fa!=fb) father[fa]=fb;
    20 }
    21 bool cmp(const xx a,const xx b)
    22 {     
    23     return b.w<a.w;
    24 }
    25 int main()
    26 {
    27     freopen("truck.in","r",stdin);
    28     freopen("truck.out","w",stdout);
    29     cin>>n>>m;    
    30     for(int i=1;i<=m;i++)
    31     {
    32         int x,y,z;
    33         scanf("%d %d %d",&x,&y,&z);
    34         bian[i].x=x,bian[i].y=y,bian[i].w=z;
    35     }
    36     sort(bian+1,bian+m+1,cmp);
    37     cin>>q;
    38     for(int i=1;i<=q;i++)
    39     {int x,y,minn=1e6,k=1;
    40         for(int i=1;i<=n;i++)father[i]=i;
    41         scanf("%d %d",&x,&y);
    42         for(int i=1;i<=m;i++)
    43         {
    44             if(find(x)==find(y)){
    45                 printf("%d
    ",minn);
    46                 break;
    47             }
    48             else if(find(bian[i].x)!=find(bian[i].y))
    49             {
    50                 unionn(bian[i].x,bian[i].y);
    51                 if(bian[i].w<minn)
    52                 minn=bian[i].w;
    53             }
    54         }
    55         if(find(x)!=find(y)) printf("-1
    ");
    56     }
    57     return 0;
    58 }

      

  • 相关阅读:
    N^N hdu1060
    二叉树的所有操作
    溢出问题
    POJ1562深搜问题
    已知前序,中序,求后序
    交换a,b
    深度和广度优先搜索
    最长回文子串
    scanf
    WCF Ria Service 理解
  • 原文地址:https://www.cnblogs.com/nigulasi/p/5664794.html
Copyright © 2020-2023  润新知