[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] 普及组的主要内容,如果未能解决你的问题,请参考以下文章

noip2009 普及组

[NOIP2009普及组]细胞分裂

[NOIP2009 普及组] 多项式输出

细胞分裂(NOIP2009 普及组第三题)

多项式输出 2009年NOIP全国联赛普及组

[Noip 2009 普及组 T4] [Luogu P1070] 道路游戏