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

[NOIP2009] 普及组

多项式输出

模拟

技术分享
 1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int mxn=110;10 int read(){11     int x=0,f=1;char ch=getchar();12     while(ch<0 || ch>9){if(ch==-)f=-1;ch=getchar();}13     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}14     return x*f;15 }16 int n,a[mxn];17 void solve(int x,int c){18     if(!c)return;19     if(!x){20         if(c>0){21             if(x==n)printf("%d",c);22             else printf("+%d",c);23         }24         else printf("%d",c);25         return;26     }27     if(x==1){28         if(c==1){29             if(x==n)printf("x");30             else printf("+x");31         }32         else if(c==-1)printf("-x");33           else if(c>0)printf("+%dx",c);34               else printf("%dx",c);35         return;36     }37     if(x==n){38         if(c==1)printf("x^%d",x);39         else if(c==-1)printf("-x^%d",x);40           else printf("%dx^%d",c,x);41         return;42     }43     if(c>0){44         if(c==1)printf("+x^%d",x);45         else printf("+%dx^%d",c,x);46         return;47     }48     if(c<0){49         if(c==-1)printf("-x^%d",x);50         else printf("%dx^%d",c,x);//51     }52     return;53 }54 int main(){55     n=read();56     for(int i=n;i>=0;i--)a[i]=read();57     for(int i=n;i>=0;i--){58         solve(i,a[i]);59     }60     printf("\n");61     return 0;62 }
多项式输出

然而翻记录发现之前写过超短的代码……

天呐仿佛退化了

技术分享
 1 #include<iostream>     2 #include<cmath>     3 using namespace std;     4 int main()     5 {     6     int n,k;     7     cin>>n;     8     for(int i=n;i>=0;i--)     9     {    10         cin>>k;    11         if(k==0)    12             continue;//系数为0不输出 13         if(k>0)14             if(i!=n)15                 cout<<"+";//直接判断符号 16         if(k<0)17             cout<<"-";18         k=abs(k);//输出绝对值 19         if(k!=1||i==0)20             cout<<k;21         if(i!=0)22             if(i!=1)    23                 cout<<"x^"<<i;24             else25                 cout<<"x";26     }    27 }   
多项式输出

 

分数线划定

 按题目要求自定义compare函数,一发sort

技术分享
 1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int mxn=6010;10 int read(){11     int x=0,f=1;char ch=getchar();12     while(ch<0 || ch>9){if(ch==-)f=-1;ch=getchar();}13     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}14     return x*f;15 }16 struct info{17     int id,sc;18 }a[mxn];19 int cmp(info a,info b){20     if(a.sc!=b.sc)return a.sc>b.sc;21     return a.id<b.id;22 }23 int n,m;24 int main(){25     n=read();m=read();26     m=floor((double)m*1.5);27     for(int i=1;i<=n;i++){28         a[i].id=read();29         a[i].sc=read();30     }31     sort(a+1,a+n+1,cmp);32     while(a[m+1].sc==a[m].sc && m<n)m++;33     printf("%d %d\n",a[m].sc,m);34     for(int i=1;i<=m;i++){35         printf("%d %d\n",a[i].id,a[i].sc);36     }37     return 0;38 }
分数线划定

 

 

细胞分裂

 对目标值分解质因数。

   再对每种可选细胞分解质因数,看需要分裂多少次可以使该种细胞的“每个质因数的次数”都比“目标值对应质因数的次数”大。

 如果该细胞的质因数中没有目标值的质因数,则无解。

技术分享
 1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 const int mxn=100010; 9 int read(){10     int x=0,f=1;char ch=getchar();11     while(ch<0 || ch>9){if(ch==-)f=-1;ch=getchar();}12     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}13     return x*f;14 }15 int pri[mxn],pct=0;16 int cnt[mxn];17 int n,m1,m2;18 19 void dvi(int m){20     for(int i=2;i<=m;i++){21         if(m%i)continue;22         pri[++pct]=i;23         while(m%i==0){24             cnt[pct]++;25             m/=i;26         }27     }28 //    for(int i=1;i<=pct;i++)printf("%d %d\n",pri[i],cnt[i]);29     for(int i=1;i<=pct;i++)cnt[i]*=m2;30     return;31 }32 int ans;33 int main(){34     n=read();m1=read();m2=read();35     dvi(m1);36     int i,j;37     ans=1e9;38     int x;39     while(n--){40         x=read();41         for(i=1;i<=pct;i++){42 //            printf("test: x:%d  pri:%d\n",x,pri[i]);43             if(x%pri[i])break;44         }45         if(i<=pct)continue;46         //47         int tmp;48         int res=0;49         for(int i=1;i<=pct;i++){50             tmp=0;51             while(x%pri[i]==0){52                 tmp++;53                 x/=pri[i];54             }55             res=max(res,(int)ceil((double)cnt[i]/(double)tmp));56         }57         ans=min(ans,res);58     }59     if(ans==1e9)printf("-1\n");60     else printf("%d\n",ans);61     return 0;62 }
细胞分裂

 

 

道路游戏

动态规划

枚举当前时间和当前所在道路,具体转移看代码。

技术分享
 1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int mxn=1005;10 int read(){11     int x=0,f=1;char ch=getchar();12     while(ch<0 || ch>9){if(ch==-)f=-1;ch=getchar();}13     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}14     return x*f;15 }16 int n,m,p;17 int price[mxn];18 int w[mxn][mxn];//时间为i,在j道路的金币数 19 int f[mxn];//时间为i,在j工厂的状态 20 void dp(){21     int i,j,k;22     int st;23     for(i=1;i<=m;++i){//时间 24         for(j=1;j<=n;j++){//当前位置25             st=j-1;if(!st)st=n;26             int tmp=w[st][i];27             for(k=1;k<=p;k++){28                 if(i-k<0)break;29                 f[i]=max(f[i],f[i-k]+tmp-price[st]);30                 st--;if(!st)st=n;31                 tmp+=w[st][i-k];32             }33         }34     }35     printf("%d\n",f[m]);36     return;37 }38 int main(){39     n=read();m=read();p=read();40     int i,j;41     for(i=1;i<=n;i++)//道路 42         for(j=1;j<=m;j++){//时间 43             w[i][j]=read();44         }45     for(i=1;i<=n;i++)price[i]=read();46     dp();47     return 0;48 }
动态规划

 

[NOIP2009] 普及组