P8627 [蓝桥杯 2015 省 A] 饮料换购
题目描述
乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊 C 型饮料,凭 3 个瓶盖可以再换一瓶 C 型饮料,并且可以一直循环下去(但不允许暂借或赊账)。
请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的 n 瓶饮料,最后他一共能喝到多少瓶饮料。
输入格式
一个整数 n,表示开始购买的饮料数量。(0<n<10000)
输出格式
一个整数,表示实际得到的饮料数。
3瓶饮料瓶可以换一瓶新的,然后这瓶新的可以参与之后的对换
就用while循环一直循环到喝完所有瓶子
完整代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, k;
int w=0,sum=0;
cin>>n;
while(n!=0)
{
n--;
w++;
sum++;
if(w==3)
{
n++;
w=0;
}
}
cout<<sum;
return 0;}
P8662 [蓝桥杯 2018 省 AB] 全球变暖
题目描述
你有一张某海域 �×�N×N 像素的照片,.
表示海洋、 #
表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中 "上下左右" 四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 22 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
搜索岛屿4个方向上有海洋就将标记,之后在输出的时候把有标记的变为海洋再输出
#include<bits/stdc++.h>
using namespace std;
int n,flag,sum;
char a[1005][1005];
bool book[1005][1005];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
bool judge(int x,int y)
{
return a[x][y]!='.';
}
int find(int x,int y)
{
book[x][y]=true;
if(judge(x+1,y)&&judge(x-1,y)&&judge(x,y+1)&&judge(x,y-1))
{
flag=0;
}
for(int i=0;i<4;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(judge(nx,ny)&&!book[nx][ny])
{
find(nx,ny);
}
}
a[x][y]='.';
return flag;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(judge(i,j)&&!book[i][j])
{
flag=1;
sum+=find(i,j);
}
}
}
cout<<sum<<endl;
}
Before an Exam
题目背景
明天皮特将要考生物。他并不很喜欢生物,但在 �d 天前他得知他将不得不参加此次考试。皮特严厉的父母勒令他立即复习,因此他在第 �i 天将需要学习不少于 minTimei 小时,不多于 maxTimei 小时。他们同时警告皮特:考试前一天,他将被检查他复习的完成情况。
因此,今天皮特的父母会要求他展示他考前复习的学习时间表。然而,他只记录这 d 天以来他复习所用的总计用时sumTime(小时).现在他希望知道他能否给他的父母展示一份时间表,包含 d 个数,每个数 schedulei 表示皮特第 i 天在复习生物上的用时(单位为小时),并应满足上文提及的要求。
题目输入
第一行包含两个数:d,sumTime。
(1≤d≤30,0≤sumTime≤240),意义如上所述。
接下来 d 行,每行两个数:minTimei,maxtimei,两个数之间有一个空格,意义如上。(0≤minTimei≤maxTimei≤8)
题目输出
如果有解,在单独一行输出 YES
,换行,输出任意一种满足上文要求的解。如果无解,在单独一行中输出 NO
。
判断能不能满足条件就看最小学习时间能不能比总时间小,最大学习时间能不能比总时间大
就是mintime<=sumtime<=maxtime
满足后,用总时间减最小时间得到富裕时间,将富裕时间逐步分给最小时间,使最小时间增大
当富裕时间为0时就可以输出了
完整代码
#include<bits/stdc++.h>
using namespace std;
int maxt[35];int mint[35];
int cz[35];
int main()
{
int d,sumtime;
int mxt=0,mit=0;
cin>>d>>sumtime;
for(int i=1;i<=d;i++)
{
cin>>mint[i]>>maxt[i];
mxt+=maxt[i];
mit+=mint[i];
cz[i]=maxt[i]-mint[i];
}
if(sumtime<mit||sumtime>mxt)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
int mucht=sumtime-mit;
if(mucht!=0)
{
bool flag=0;
for(int i=1;i<=d;i++)
{
if(flag==1)
{
break;
}
for(int j=1;j<=cz[i];j++)
{
mint[i]++;
mucht--;
if(mucht==0)
{
flag=1;
break;
}
}
}
}
for(int i=1;i<=d;i++)
{
cout<<mint[i]<<" ";
}
}
return 0;
}
P1455 搭配购买
题目描述
明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n 朵云,云朵已经被老板编号为 1,2,3,...,1,2,3,...,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉得这礼物实在是太新奇了,但是你的钱是有限的,所以你肯定是想用现有的钱买到尽量多价值的云。
输入格式
第一行输入三个整数,n,m,w,表示有 n 朵云,m 个搭配和你现有的钱的数目。
第二行至 1n+1 行,每行有两个整数, ci,di,表示第 i 朵云的价钱和价值。
第 2n+2 至 n+1+m 行 ,每行有两个整数 ui,vi。表示买第ui 朵云就必须买第 vi 朵云,同理,如果买第 vi 朵就必须买第 ui 朵。
输出格式
一行,表示可以获得的最大价值。
01背包和并查集的合体版,就把需要捆绑购买的云合并到同一个集合里
再用01背包去遍历,得出最大价值即可
#include<bits/stdc++.h>
using namespace std;
int fa[10005];
int dp[10005],v[10005],w[10005];
int n,m,sum;
int h,j;
void iint()
{
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
}
int find(int u)
{
if(fa[u]==u)
{
return u;
}
return fa[u]=find(fa[u]);
}
void join(int u,int v)
{
u=find(u);
v=find(v);
if(v==u) return;
fa[v]=u;
}
int main()
{
cin>>n>>m>>sum;
iint();
for(int i=1;i<=n;i++)
{
cin>>w[i]>>v[i];
}
for(int i=1;i<=m;i++)
{
cin>>h>>j;
join(h,j);
}
for(int i=1;i<=n;i++)
{
if(fa[i]!=i)
{
v[find(i)]+=v[i];
v[i]=0;
w[find(i)]+=w[i];
w[i]=0;
}
}
for(int i=1;i<=n;i++)
{
for(int l=sum;l>=w[i];l--)
{
dp[l]=max(dp[l],dp[l-w[i]]+v[i]);
}
}
cout<<dp[sum];
return 0;
}