【NOIP2007】提高组

T1统计数字

题目链接

排个序扫一遍就没了吧......

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 int a[200005];
 7 int read()
 8 {
 9     char c=getchar();int ans=0,f=1;
10     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
11     while(c>='0'&&c<='9'){ans=ans*10+c-48;c=getchar();}
12     return ans*f;
13 }
14 int main()
15 {
16     int n=read(),m=0;
17     for(int i=1;i<=n;i++)a[i]=read();
18     sort(a+1,a+1+n);
19     for(int i=1;i<=n;i++)
20     {
21         if(a[i]==a[i+1])m++;
22         else
23         {
24             printf("%d %d\n",a[i],m+1);
25             m=0;
26         }
27     }
28     return 0;
29 }
T1

 

T2字符串的展开

题目链接

超级大分类的模拟题,没什么好讲的......

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 const int N=1e5+10;
 5 using namespace std;
 6 char c[N];
 7 int p1,p2,p3;
 8 int main()
 9 {
10     scanf("%d %d %d",&p1,&p2,&p3);
11     scanf("%s",c+1);
12     int len=strlen(c+1);
13     for(int i=1;i<=len;i++){
14         if(c[i]!='-'){
15             printf("%c",c[i]);continue;
16         }
17         if(i==1){printf("-");continue;}
18         if(c[i+1]=='-'||c[i-1]=='-'){printf("-");continue;}
19         if(c[i+1]<=c[i-1]||(c[i+1]>='a'&&c[i-1]<='9')){printf("-");continue;}
20         if(c[i+1]==c[i-1]+1)continue;
21         if(p1==3){
22             for(int j=1;j<=p2*(c[i+1]-c[i-1]-1);j++)printf("*");
23             continue;
24         }
25         if(p3==1){
26                 if(p1==1||(c[i-1]>='0'&&c[i-1]<='9')){
27                     for(int j=c[i-1]+1;j<=c[i+1]-1;j++){
28                         for(int k=1;k<=p2;k++)printf("%c",j);
29                     }
30                 }
31                 else{
32                     for(int j=c[i-1]+1;j<=c[i+1]-1;j++){
33                         for(int k=1;k<=p2;k++)printf("%c",j-('a'-'A'));
34                     }
35                 }
36         }
37         else{
38             if(p1==1||(c[i-1]>='0'&&c[i-1]<='9')){
39                     for(int j=c[i+1]-1;j>=c[i-1]+1;j--){
40                         for(int k=1;k<=p2;k++)printf("%c",j);
41                     }
42                 }
43                 else{
44                     for(int j=c[i+1]-1;j>=c[i-1]+1;j--){
45                         for(int k=1;k<=p2;k++)printf("%c",j-('a'-'A'));
46                     }
47                 }
48         }
49     }
50     return 0;
51 }
T2

 

T3树网的核

题目链接

n3跑一遍floyd预处理出两两之间最短路,n2枚举两个在直径上的点统计答案就好了。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 const int inf=0x3f3f3f3f;
 5 using namespace std;
 6 int n,s,a,b,c,maxx=0,mxi,mxj;
 7 int dis[305][305];
 8 int read()
 9 {
10     int ans=0,f=1;char c=getchar();
11     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
12     while(c>='0'&&c<='9'){ans=ans*10+c-48;c=getchar();}
13     return ans*f;
14 } 
15 int main()
16 {
17     n=read();s=read();
18     for(int i=1;i<=n;i++)
19         for(int j=1;j<=n;j++)
20             if(i!=j)dis[i][j]=inf;
21     for(int i=1;i<=n-1;i++){
22         a=read();b=read();c=read();dis[a][b]=dis[b][a]=c;
23     }
24     for(int k=1;k<=n;k++)
25         for(int i=1;i<=n;i++)
26             for(int j=1;j<=n;j++){
27                 if(dis[i][k]>=inf||dis[k][j]>=inf)continue;
28                 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
29                 if(dis[i][j]>maxx){
30                     maxx=dis[i][j];
31                     mxi=i;mxj=j;
32                 }
33             }
34     int ans=inf;
35     for(int i=1;i<=n;i++){
36         if(dis[mxi][i]+dis[i][mxj]!=dis[mxi][mxj])continue;
37         for(int j=1;j<=n;j++){
38             if(dis[mxi][j]+dis[j][mxj]!=dis[mxi][mxj]||dis[i][j]>s)continue;
39             int ecc=0;
40             ecc=max(min(dis[mxi][i],dis[mxi][j]),min(dis[mxj][i],dis[mxj][j]));
41             ans=min(ans,ecc);
42         }
43     }
44     printf("%d",ans);
45     return 0;
46 } 
T3

T4矩阵取数游戏

题目链接

这题要是没有高精就是一道简单dp了,不过加上高精乘之后就很不好写了。然而我们可以把状态转移方程化为:

f[i][j]=2*max(f[i+1][j]+mp[i]+mp[i][j],f[i][j-1]+mp[j]);

这样我们就只用写两个高精加就行了(然而还是很不好写)......

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<cstring>
 4 #define mem(a,p) memset(a,p,sizeof(a))
 5 #include<algorithm>
 6 const int N=85;
 7 int n,m;
 8 int read(){
 9     int ans=0,f=1;char c=getchar();
10     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
11     while(c>='0'&&c<='9'){ans=ans*10+c-48;c=getchar();}
12     return ans*f;
13 }
14 int f[N][N][100],data[N][N],ans[100],kk[100],pp[100],dd[100];
15 int mxa(int x,int y){return x>y?x:y;}
16 void plus0(int x[],int y[]){
17     x[0]=mxa(x[0],y[0]);
18     for(int i=1;i<=x[0];i++){
19         x[i]+=y[i];
20         x[i+1]+=x[i]/10;
21         x[i]%=10;
22     }
23     if(x[x[0]+1]>0)x[0]++;
24 }
25 void max(int x[],int y[],int z[]){
26     if(y[0]>z[0]){plus0(x,y);return;}
27     if(z[0]>y[0]){plus0(x,z);return;}
28     for(int i=y[0];i>=1;i--){
29         if(y[i]>z[i]){plus0(x,y);return;}
30         if(y[i]<z[i]){plus0(x,z);return;}
31     }
32     plus0(x,y);
33 }
34 void plus1(int x[],int y,int z[]){
35     x[1]=z[1]+y;
36     for(int i=1;i<=z[0];i++){
37         x[i+1]+=x[i]/10+z[i+1];
38         x[i]%=10;
39     }
40     x[0]=z[0];
41     if(x[x[0]+1]>0)x[0]++;
42 }
43 int main(){
44     n=read();m=read();
45     for(int i=1;i<=n;i++)
46         for(int j=1;j<=m;j++)
47             data[i][j]=read();
48     for(int r=1;r<=n;r++){
49         mem(f,0);
50         for(int i=m;i>=1;i--){
51             for(int j=i;j<=m;j++){
52                 mem(kk,0);mem(pp,0);
53                 plus1(kk,data[r][j],f[i][j-1]);
54                 for(int k=0;k<=kk[0];k++)pp[k]=kk[k];
55                 plus0(kk,pp);mem(dd,0);mem(pp,0);
56                 plus1(pp,data[r][i],f[i+1][j]);
57                 for(int k=0;k<=pp[0];k++)dd[k]=pp[k];
58                 plus0(pp,dd);
59                 max(f[i][j],pp,kk);
60             }
61         }
62         plus0(ans,f[1][m]);
63     }
64     if(ans[0]==0)return printf("0"),0;
65     for(int i=ans[0];i>=1;i--)printf("%d",ans[i]);
66     return 0;
67 }
T4

 

posted @ 2017-11-05 19:22  Child-Single  阅读(255)  评论(0编辑  收藏  举报