A打怪
题意:我和怪物都有血量,都有攻击值。我和怪物轮流攻击,当然我先开始,问在我血量为0之前最多能杀几个怪。
分析
统计怪物死需要打几次cnt,我死需要打几次cnt1。
如果怪物一次就死,则我可以杀无数个怪。
否则我的血量需要减去(cnt-1)*怪的攻击力
ac代码
#include<iostream>
using namespace std;
int t,h,a,H,A;
int main(){
cin>>t;
while(t--){
cin>>h>>a>>H>>A;
int tmp1=h,tmp2=H;
int cnt=0,cnt1=0;
while(tmp2>0){//怪需要几次才死
tmp2-=a;
cnt++;
}
while(tmp1>0){//我需要几次才死
tmp1-=a;
cnt1++;
}
if(cnt==1){
cout<<-1<<endl;
continue;
}
int num=0;
do{
h-=A*(cnt-1);
if(h>0) num++;
}
while(h>0);
cout<<num<<endl;
}
}
B吃水果
分析
AC代码
#include<iostream>
using namespace std;
int t;
typedef long long ll;
ll n,m;
int main(){
cin>>t;
while(t--){
cin>>n>>m;
if(n==m){//一样多
cout<<n<<endl;
continue;
}
int a=max(m,n);//较大者
int b=min(m,n);//较小者
if(a==2*b){
cout<<a+1<<endl;
continue;
}
int cnt=0;
while(a!=2*b){
if(a/2>=b){
b*=2;
cnt++;
}
else{
a--;
b--;
cnt++;
}
}
cout<<cnt+a+1<<endl;
}
return 0;
}
C咪咪游戏
这个串是由连续的mq连接而成的。
判断是否合法
输入
4
mqmq
mqmqm
mqakioi
mqqmmq
输出
Yes
No
No
No
这题考虑少了只有qmqmqm的情况,竟然还过了!
需要学习大佬的简洁的代码。
宝盒
占坑来答,这是一道分组揹包的题目。
E小心思
题意
给定行李箱的体积和每件行李压缩前后的体积,问最少压缩几个袋子可以把行李放进行李箱。
分析
求出压缩前所有行李的体积和sum1,求出压缩后所有行李的体积和sum2。
如果压缩前体积小于行李箱体积,则必可装
如果压缩后体积大于行李箱体积,则必不可装。
其他情况,必然是压缩前放不下, 压缩后可以放下
按照压缩前后体积之差从大到小排序,遍历压缩即可。
int cnt=0,p=1;
while(sum1>m&&p<=n){
sum1+=(a[p].hou-a[p].qian);
cnt++;//袋子个数
p++;//下一个
}
ac代码
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
struct node{
ll qian,hou;
}a[maxn];
//压缩前后体积相差最大的排在前面
bool cmp(node a,node b){
return(a.qian-a.hou>b.qian-b.hou);
}
int n,m;
int main(){
while(cin>>n>>m){
ll sum1=0,sum2=0;
for(int i=1;i<=n;i++){
cin>>a[i].qian>>a[i].hou;
sum1+=a[i].qian;
sum2+=a[i].hou;
}
if(sum1<=m){//不用压缩
cout<<0<<endl;
continue;
}
if(sum2>m){//压缩后放不下
cout<<-1<<endl;
continue;
}
sort(a+1,a+n+1,cmp);
int cnt=0,p=1;
while(sum1>m&&p<=n){
sum1+=(a[p].hou-a[p].qian);
cnt++;//袋子个数
p++;//下一个
}
cout<<cnt<<endl;
}
}
F多元组
这是一道dp+树状数组的题目
ac代码链接M元上升子序列【树状数组+dp】