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;
}