hdu 贪心


二分
搜索 +1
回溯法
递归和回溯
树形dp
没时间了,就这样吧

  1. 贪心
  2. hdu 1009
#include<stdio.h>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1005;
const int inf = 1e5;
int m,n;
struct node{
	int j;
	int f;
	double v;
}c[maxn];
bool cmp1(node a,node b){
	return a.v < b.v; 
}
int main(){
	while(scanf("%d %d",&m,&n)){
		if((n == -1)&&(m == -1)){
			break;
		}
		double ans = 0;
		for(int i = 0;i < n;i ++){
			scanf("%d %d",&c[i].j,&c[i].f);
		}
		for(int i = 0;i < n;i ++){
			if(c[i].j != 0){
				c[i].v = (c[i].f *1.0)/ (1.0*c[i].j);
//				printf("1:%d %d %lf\n",c[i].f,c[i].j,c[i].v);
			}
				
			else
				c[i].v = inf;
		}
		sort(c,c+n,cmp1);
//		for(int i = 0;i < n;i ++){
//			printf("%d %d %lf\n",c[i].f,c[i].j,c[i].v);
//		}
		
		for(int i = 0;i < n;i ++){
			if(m > c[i].f){
				m -= c[i].f;
				ans += c[i].j;
			}
			else{
				double temp = (m*1.0 )/ c[i].f;
				ans += c[i].j*temp;
				m = 0;
			}
			if(m == 0)
				break;
		}
		printf("%.3lf\n",ans);
	}
	return 0;
}
  • hdu 1789
#include<stdio.h>
#include<memory.h>
#include<algorithm>
using namespace std;
const int maxn = 1005;
int n;
int t;
int vis[maxn];
struct node{
	int date;
	int down;
}a[maxn];
bool cmp1(node a,node b){
	return a.down > b.down;
}
int main(){
	scanf("%d",&t);
	while(t -- ){
		scanf("%d",&n);//表示作业的数量
		memset(vis,0,sizeof(vis));
		for(int i = 0;i < n;i ++){
			scanf("%d",&a[i].date);
		} 
		for(int i = 0;i < n;i ++){
			scanf("%d",&a[i].down);
		}
		sort(a,a+n,cmp1);
		int ans = 0;
		for(int i = 0 ;i < n;i ++){
			int flag = 0;
			for(int j = a[i].date;j > 0;j --){
				if(vis[j] == 0){//这一天没有被访问过
					vis[j] = 1;
					flag = 1; 
					break;
				}
			}
			if(flag == 0){
				ans += a[i].down;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}
//16:13
  1. 哈夫曼编码权值的应用
#include<stdio.h>
#include<memory.h>
#include<algorithm>
#include<string>
#include<string.h>
#include<cstring>
using namespace std;
const int maxn = 1005;
const int inf = 1e9;
int t;
int m;
char s[maxn];
int word[26];
int main(){
	scanf("%d",&t);
	while(t -- ){
		scanf("%d",&m);
		scanf("%s",&s);
		int sum = 0;
		memset(word,0,sizeof(word));
		int len = strlen(s);
		for(int i = 0;i < len;i ++){
			word[s[i] - 'a'] ++;
		}
		for(int i = 0;i < 26 ;i ++){
			if(word[i] == 0)
				word[i] = inf;
		} 
		sort(word,word+26);//将字符串按照从小到大排序
		if(word[1] == inf){//在测试的时候,只有一个字母
			sum = word[0] ;	
		}
		while(word[1] != inf){
			sum += word[0] + word[1];
			word[0] += word[1] ;
			word[1] = inf;
			sort(word,word+26);
		}
		if(sum <= m)
			printf("yes\n");
		else
			printf("no\n");	
	}
	return 0;
}

树:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值