洛谷p1498:递归三部分
思路:对于一个大图形分解三个小图形,递归处理这三个小图形,当n为一时打出最小图形,开始回退,利用每个大图形的'/'划分为三部分,即三个递归入口
代码:
# include <bits/stdc++.h>
using namespace std;
char mp[1030][2050];
int n;
void dfs(int x,int y,int deep)
{
if(deep==1)//深度等于一时在字符数组中储存答案并返回
{
mp[x][y]='/';
mp[x][y+1]='\\';
mp[x+1][y-1]='/';
mp[x+1][y]='_';
mp[x+1][y+1]='_';
mp[x+1][y+2]='\\';
return;
}
dfs(x,y,deep-1);//上
dfs(x+pow(2,deep-1),y-pow(2,deep-1),deep-1);//左
dfs(x+pow(2,deep-1),y+pow(2,deep-1),deep-1);//右
}
int main ()
{
int n;
cin>>n;
// memset(mp,' ',sizeof(mp));
for(int i=1;i<=pow(2,n);i++){ //初始化
for(int j=1;j<=pow(2,n+1);j++)
mp[i][j]=' ';
}
dfs(1,pow(2,n-1)*2,n);
for(int i=1;i<=pow(2,n);i++)
{
for(int j=1;j<=pow(2,n+1);j++)
{
cout<<mp[i][j];
}
cout<<endl;
}
return 0;
}
洛谷p2240:贪心
思路:贪心的每次取性价比最高的物品,金币可以分割,所以把背包装满即可。对物品用结构体排序即可
代码:
# include <bits/stdc++.h>
using namespace std;
int dp[105][1005];
int n,v[105],m[105];
int t;
struct thing
{
int m;
int v;
double ave=0.0;
}bag[105];
bool cmp(thing a,thing b)
{
if(a.ave>b.ave)return 1;
return 0;
}
int main ()
{
// cin>>n>>t;
scanf("%d%d",&n,&t);
for(int i=1;i<=n;i++)
{
//cin>>m[i]>>v[i];
scanf("%d%d",&bag[i].m,&bag[i].v);
bag[i].ave=1.0*bag[i].v/bag[i].m;
}
sort(bag+1,bag+n+1,cmp);
int sum=0;
double ans=0.0;
for(int i=1;i<=n;i++)
{
sum+=bag[i].m;
ans+=bag[i].v;
if(sum>t)
{
sum-=bag[i].m;
ans-=bag[i].v;
ans+=1.0*(t-sum)*bag[i].ave;
break;
}
}
printf("%.2f",ans);
return 0;
}
洛谷p1223:贪心
思路:贪心策略:让打水时间少的先接水
代码:
# include <bits/stdc++.h>
using namespace std;
int sum[1005];
struct man
{
int num;
int time;
}people[1005];
bool cmp(man a,man b)
{
if(a.time<b.time)return 1;
return 0;
}
int main ()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
people[i].num=i;
scanf("%d",&people[i].time);
}
sort(people+1,people+n+1,cmp);
double ans=0;
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+people[i].time;//求时间的前缀和
printf("%d ",people[i].num);
}
printf("\n");
for(int i=2;i<=n;i++)
{
ans+=sum[i-1];
}
printf("%.2f",ans/n);
return 0;
}
洛谷p1803:贪心
思路:贪心策略:先完成结束时间最短的比赛。用结构体排序即可
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct man
{
ll start;
ll ending ;
}game[100005];
bool cmp(man a,man b)
{
if(a.ending <b.ending)return 1;
return 0;
}
int main ()
{
ll n;
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
{
scanf("%lld %lld",&game[i].start,&game[i].ending );
}
sort(game+1,game+n+1,cmp);
// for(int i=1;i<=n;i++)printf("%lld",game[i].ending);
ll ans=1,sum=0;//sum表示对当前比赛,前面有几个比赛不符合要求
for(int i=2;i<=n;i++)
{
if(game[i].start<game[i-1-sum].ending)
{
sum++;
continue;
}
if(game[i].start>=game[i-1-sum].ending)
{
ans++;
sum=0;//注意清零,每次以当前i为基准判断,初始是1为基准
}
}
printf("%lld",ans);
return 0;
}