I. The Humanoid

题意:

有n个宇航员,每个宇航员的能量是a[i],一个怪兽的力量是h,怪兽有两瓶绿色血清(使用后力量2),蓝色血清(使用后力量3),吃掉一个宇航员,将会获得他力量的一半取整。问最多能吃掉几个宇航员?

思路:

将a[i]排序,如果能吃,则吃掉,如果不能吃,则枚举绿绿蓝,绿蓝绿,蓝绿绿三种情况,取最大的。

代码:

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 200200;

int n;
int arr[MAXN];

int solve(int i, long long h, int s2, int s3) {
    if (i == n) return 0;
    if (arr[i] < h)
        return solve(i + 1, h + (arr[i] / 2), s2, s3) + 1;
    int ans1 = (s2 ? solve(i, h * 2, s2 - 1, s3) : 0);
    int ans2 = (s3 ? solve(i, h * 3, s2, s3 - 1) : 0);
    return max(ans1, ans2);
}

int main() {
    int t; cin >> t;
    while(t--) {
        long long h; cin >> n >> h;
        for (int i = 0; i < n; ++i)
            cin >> arr[i];
        sort(arr, arr + n);
        cout << solve(0, h, 2, 1) << endl;
    }
}

K. Thermostat

题意:

在温度从l到r的温度器里,每次调温至少是x,从a到b最少需要调温几次,如果不行,则输入-1

思路:

  • 如果a=b,则0
  • 如果a到b的距离>=x,则为1
  • 如果a-b的<x,则先把a移到符合题意的l或r,如果能到b,则输出2
  • 如果不能到b,再把a从l或r移到r或l,如果能到b,则3
  • 其他输出-1

    代码:

    
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    ll t,l,r,x,a,b;
    ll cnt;
    int main(){
    cin>>t;
    while (t--){
        cin>>l>>r>>x;
        cin>>a>>b;
        cnt=0;
        if(a==b) {
            cout << '0' << endl;
        }
        else if(abs(b-a)>=x) {
            cout << '1' << endl;
        }
        else if(abs(b-a)<x){
                ll lll,rrr;
                lll=a-l;
                rrr=r-a;
                if(lll>=x){
                    if(b-l>=x){
                        cout<<'2'<<'\n';
                        continue;
                    }
                }
                if(rrr>=x){
                    if(r-b>=x){
                        cout<<'2'<<'\n';
                        continue;
                    }
                }
                if(lll>=x){
                    if(r-b>=x) {
                        cout <<'3'<<'\n';
                        continue;
                    }
    
                }
                if(rrr>=x){
                     if(b-l>=x){
                        cout<<'3'<<endl;
                        continue;
                    }
    
                }
                cout<<"-1"<<endl;
    
        }
    
    }
    }

# [G. Quests](https://codeforces.com/group/L9GOcnr1dm/contest/418722/problem/G)
##  题意:
n个硬币,第i个的价值是a[i],一天只能拿一个,在d天里,所拿硬币>=c,求出每个硬币的最大冷却时间k
##  思路:
- 首先降序排列a
- 二分查找k,k+1不成立,k成立
- 如果k>=d,则k无限
- 如果k趋近于0,不可能
- 其他输出k
##  代码:
```cpp
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int t,n,d;
ll a[200005],c;
int main(){
    cin>>t;
    while(t--){
        cin>>n>>c>>d;
        for(int i=0;i<n;i++)
            cin>>a[i];
        sort(a,a+n,greater<ll>());
        int l=0,r=d+2;
        while(l<r){
            int m=l+(r-l+1)/2;
            ll s=0;
            for(int i=0;i<d;i++){
                if(i%m<n)
                    s+=a[i%m];
            }
            if(s>=c){
                l=m;
            }
            else{
                r=m-1;
            }
        }
        if(l==d+2){
            cout<<"Infinity"<<endl;
        }
        else if(l==0)
            cout<<"Impossible"<<endl;
        else cout<<l-1<<endl;
    }
}
```

# H题暂时不太清楚异或逻辑运算
posted on 2023-01-08 17:23  IR101  阅读(13)  评论(0编辑  收藏  举报  来源