首页 > 代码库 > [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] 普及组
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。