[NOIP2009] 普及组
Posted SilverNebula
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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 else 25 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] 普及组的主要内容,如果未能解决你的问题,请参考以下文章