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】