0050 零崎的补番计划Ⅰ
找第k大元素。
思路:分治。
#include <cstdio>
#include <cstring>
int a[1000005],b[500005],c[500005];
void find(int* d,int* e,int* f,int k,int pi){
int i,lower=0,bigger=0,num=*(d+1+pi/2);
for(i=1;i<=pi;i++){
if(*(d+i)<num){
lower++;
*(e+lower)=*(d+i);
}
if(*(d+i)>num){
bigger++;
*(f+bigger)=*(d+i);
}
}
if(bigger==k-1)printf("%d\n",num);
else if(bigger<k-1){
find(e,d,f,k-bigger-1,lower);
}
else if(bigger>k-1){
find(f,d,e,k,bigger);
}
return ;
}
int main(){
int i,n,k,num,pi;
while(scanf("%d%d",&n,&k)==2){
pi=0;memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));
for(i=1;i<=n;i++){
scanf("%d",&num);
a[++pi]=num;
}
find(a,b,c,k,pi);
}
}
0051 零崎的补番计划Ⅱ
01背包问题,注意读入的时候可以同时dp
#include <iostream>
#include <cstring>
using namespace std;
int f[20010];
int main()
{
int T,k,i,j,v,t;
while(cin>>T>>k){
memset(f,0,sizeof(f));
for(i=1;i<=k;i++){
cin>>v>>t;
for(j=T;j>=t;j--)f[j] = max(f[j-t]+v,f[j]);
}
cout<<f[T]<<endl;
}
}
0052 零崎的补番计划Ⅲ
Floyd算法模板题
#include <iostream>
#define INF 0xffffff
using namespace std;
int map[505][