首页 > 代码库 > [NOIP2013] 普及组

[NOIP2013] 普及组

 

计数问题

纯模拟

技术分享
 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int main(){ 5     int n,x; 6     cin>>n>>x; 7     int i,c=0; 8     for(i=1;i<=n;i++){ 9         int a=i;10         while(a!=0){11             if(a%10==x)c++;12             a/=10;13         }14     }15     cout<<c;16     return 0;17 }
计数问题

 

表达式求值

模拟计算,扫一遍出解

技术分享
 1 /*NOIP2013普及组t2 洛谷P1981 表达式求值*/ 2 /**/ 3 #include<algorithm> 4 #include<iostream> 5 #include<cstring> 6 #include<cstdio> 7 #include<cmath> 8 using namespace std; 9 char last;10 char c;11 int x=0;12 int a=0,b=1;13 int sum=0;14 int main(){15     int i,j;16     bool flag=1;17     do{18         if(cin>>c);19         else{20             flag=0;21             c=+;22         }23         if(c>=0 && c<=9)x=x*10+c-0;24         else{25             a=x;26             x=0;27         }28         if(c==*){29             last=1;30             b=(a*b)%10000;31         }32         if(c==+){33             if(last){34                 a=(a*b)%10000;35                 sum=(sum+a)%10000;36                 b=1;37                 last=0;38             }39             else sum+=a;40         }41         42     }while(flag==1);43     printf("%d",sum%10000);44     return 0;45 }
表达式求值

 

小朋友的数字

线性DP

技术分享
 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const long long inf=1000000005; 7 int n,p,a[1000500]; 8  9 long long su[1000500]={0};//特征值 10 long long scoremx=-inf;//前排最大分数 11 long long dmx=-inf;12 long long ans=-inf;13 int sum1(){14     int i,j;15     long long s=0;16     long long mx=-inf;17     for(i=1;i<=n;i++){18         if(s+a[i]>mx)mx=s+a[i];19         su[i]=mx;20         if(s+a[i]>0) s+=a[i];21         else s=0;22     }23     //24     for(i=1;i<=n;i++){25         su[i]%=p<<1;26     }27     return 0;28 }29 int main(){30     int i,j;31     scanf("%d%d",&n,&p);32     for(i=1;i<=n;i++)scanf("%d",&a[i]);33     sum1();34     long long score;35 //136     scoremx=su[1];37     score=su[1];38     dmx=score+su[1];39 //end40     for(i=2;i<=n;i++){41         score=dmx;42         if(dmx>scoremx)scoremx=dmx;43         if(su[i]+score>dmx)dmx=su[i]+score;44     }45     printf("%d",scoremx%p);46     return 0;47 }
小朋友的数字

 

车站分级

从已知的低级站向高级站连边,跑拓扑排序得出层级关系

 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 int n,m; 8 int a;//[第i趟车次的停靠站数] 9 int s[2000];//[第i趟车次停靠的站] 10 int mp[1200][1200]={0};11 int book[1200];12 int r[1200],c[1200]; 13 int st[1200];14 int ans=0;15 void rd(){16     scanf("%d%d",&n,&m);17     int i,j,k;18     for(i=1;i<=m;i++){19         memset(book,0,sizeof(book));20         scanf("%d",&a);21         for(j=1;j<=a;j++){22             scanf("%d",&s[j]);23             book[s[j]]=1;24         }25         for(k=s[1];k<=s[a];k++)//遍历从始发站到终点站26         {27             if(!book[k])28                 for(j=1;j<=a;j++)29                 if(!mp[k][s[j]])//从低级连到高级可过,从高级连到低级超时 30                 {31                  mp[k][s[j]]=1;32                  r[s[j]]++;}33         }34         35     }36 }37 int main(){38 //    freopen("level.in","r",stdin);39 //    freopen("level.out","w",stdout);40     rd();41     int i,j;42     int top=0;43     memset(book,0,sizeof(book));44     while(1){45         ans++;46         top=0;47         for(i=1;i<=n;i++)48             if(!r[i] && !book[i])49             {50                 top++;51                 st[top]=i;52                 book[i]=1;53             }54             55         if(!top)break;56         for(j=1;j<=n;j++)57           for(i=1;i<=top;i++){58               if(mp[st[i]][j]){59                   mp[st[i]][j]=0;60                   r[j]--;61               }62           }    63         if(!top)break;64     }    65     66     printf("%d",ans-1);67     68     69     return 0;70 }

 

[NOIP2013] 普及组