NOIP2004提高组
来源:互联网 发布:字体管家软件下载 编辑:程序博客网 时间:2024/06/05 13:31
2004提高
A.津津的储蓄计划(模拟)
B.合并果子(贪心+优先队列)
C.合唱队形(dp)
D.虫食算(搜索+数学)
A
#include<cstdio>int a,b,s=0,n,ans=0,i,flag=0;int main(){ //freopen("eg.in","r",stdin); for(i=1;i<=12;i++){ scanf("%d",&a);b=300+s-a; if(b<0){flag=1;break;} else n=b/100,ans=ans+n,s=b-n*100; } if(flag==1) printf("-%d",i); else printf("%d",ans=ans*120+s); return 0;}
B
#include<cstdio>#include<queue>using namespace std;priority_queue<int,vector<int>,greater<int> >q;int main(){ int n,ans=0; scanf("%d",&n); for(int i=1;i<=n;i++){ int x;scanf("%d",&x);q.push(x); } for(int i=1;i<n;i++){ int t=0;t+=q.top();q.pop(); t+=q.top();q.pop(); q.push(t);ans+=t; } printf("%d",ans); return 0;}
C
#include<cstdio>int n,a[101],f1[101],f2[101],ans=0;int main(){ //freopen("a.in","r",stdin); scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]); for(int i=1;i<=n;++i){ //求从左到右最长上升子序列 f1[i]=1; for(int j=1;j<i;++j) if(a[j]<a[i]&&f1[j]+1>f1[i]) f1[i]=f1[j]+1; } for(int i=n;i>=1;--i){ //求从右到左最长上升子序列 f2[i]=1; for(int j=i+1;j<=n;++j) if(a[j]<a[i]&&f2[j]+1>f2[i]) f2[i]=f2[j]+1; } for(int i=1;i<=n;++i) //找留下最多人的 if(f1[i]+f2[i]-1>ans) ans=f1[i]+f2[i]-1; printf("%d",n-ans); //求的是最少走多少人 return 0;}
D
#include<cstdio>#include<cstring>#include<cstdlib>int n,a[4][28],ans[28],map[4][28];char s[28];bool flag=false,f[28],exi=false;bool check(int i){ while(i--) if(ans[a[1][i]]!=-1&&ans[a[2][i]]!=-1&&ans[a[3][i]]!=-1){ int k=ans[a[1][i]]+ans[a[2][i]],x=ans[a[3][i]]; if((k+1)%n==x||k%n==x) continue; return 0; } return 1;}void dfs(int x,int y,int v,bool flag){ if(x==1&&y==0){ for(int i=1;i<=n;i++) printf("%d ",ans[i]);exit(0); } if(!check(y)) return; if(x==3){ if(v>=n) flag=1,v-=n; if(ans[a[x][y]]==-1){ if(!f[v]) return; f[v]=0;ans[a[x][y]]=v; dfs(1,y-1,0,flag); f[v]=1;ans[a[x][y]]=-1; } else{ if(ans[a[x][y]]!=v) return; dfs(1,y-1,0,flag); } } else{ if(flag) v+=1,flag=0; if(ans[a[x][y]]==-1) for(int j=n-1;j>=0;--j){ if(!f[j]) continue; f[j]=0;ans[a[x][y]]=j; dfs(x+1,y,v+j,flag); f[j]=1;ans[a[x][y]]=-1; } else dfs(x+1,y,v+ans[a[x][y]],flag); } }int main(){ //freopen("a.in","r",stdin); scanf("%d",&n); for(int i=1;i<=3;++i){ scanf("%s",s); for(int j=0;j<n;++j) a[i][j+1]=s[j]-'A'+1; } memset(ans,-1,sizeof(ans)); memset(f,1,sizeof(f)); dfs(1,n,0,0); return 0;}
阅读全文
0 0
- noip2004提高组
- NOIP2004提高组-虫食算
- NOIP2004提高组
- noip2004(提高组) 合唱队形
- 【搜索】【NOIP2004提高组】四、虫食算
- 【NOIP2004提高组】合并果子(贪心)
- 【NOIP2004提高组T4】虫食算-搜索剪枝
- 合并果子(NOIP2004)提高组
- NOIP2004提高组T2 合并果子
- 【最长上升子序列】[NOIP2004提高组]合唱队形
- 【模拟】【NOIP2004提高组】津津的储蓄计划
- 【双队列】【NOIP2004提高组】二、合并果子
- noip2004年提高组复赛C语言版标程
- NOIP2004 提高组 复赛 save 津津的储蓄计划
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(四)NOIP2004-NOIP2005
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(三)NOIP2004-NOIP2005
- Noip2004普及组
- NOIP2004普及组:合并果子
- SVM学习
- 字典
- DOM元素中映射、重绘和回流
- Java自定义实现链队列
- java 中的this关键字的几种用法
- NOIP2004提高组
- 201312-4 有趣的数
- OpenGL ES学习001---绘制三角形
- opencv 设置任意形状的ROI的各种方法
- spring容器
- Mybatis学习笔记(二)【mybatis概述】
- hibernate_三种查询方式
- UML中的九大图
- 7-10 树的同构(25 point(s))