9/21 越努力越幸運-思惟賽(4.0)

F.CodeForces - 1118D1html

題意:有n杯咖啡,須要寫m頁做業;他天天能夠喝 不限量 杯 咖啡(1或者多杯);每杯咖啡能夠讓他寫ai頁做業;在同一天裏,他所喝的咖啡能讓他寫w頁;ios

w=(第一杯+第二杯-1+第三杯-2……);求最少喝幾天能寫完做業(這題意好像描述的不是不少,湊合~語文很差)c++

解:排序+二分答案,下限1天,上限n天,check的話直接看碼;數組

O(nlogn)ide

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;
int a[MAXN];
int n,m;
bool check(int mid){
    int ans=0;
    int i=1;
    int cnt=0;
    int k=mid;
    while(i<=n){
        for(;i<=min(k,n);i++){
            ans+=max(a[i]-cnt,0);
        }
        if(ans>=m)return true;
        k=k+=mid;
        cnt++;
    }
    return false;
}
bool cmp(int x,int y){
    return x>y;
}
int main(){
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+1+n,cmp);
    int ans=-1;
    int l=1,r=n,mid;
    while(l<=r){
        mid=(l+r)>>1;
        if(check(mid)){
            r=mid-1;
            ans=mid;
        }
        else l=mid+1;
    }
    cout<<ans<<endl;


    return 0;
}
View Code

E.CodeForces - 1221Cpost

題意:acm組隊,有a個代碼手,b個數論king,c個閒人;spa

求最多能組多少隊,每隊至少要有1個代碼手和一個數論king;.net

解:模擬?;easycode

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
typedef long long ll;
int main(){
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--){
        ll a,b,c,minn;
        cin>>a>>b>>c;
        minn=min(a,min(b,c));
        if(minn!=c){
            cout<<minn<<endl;
        }
        else{
            a-=c;b-=c;
            cout<<minn+min(a,min(b,(a+b)/3))<<endl;
        }
    }



    return 0;
}
View Code

D.CodeForces - 1221Bhtm

題意:給一個n,輸出一個圖(只含有W,B),使得每一個W或B能攻擊B或W的個數最多;

每一個只能攻擊日字對角線上的;W攻擊B,B攻擊W;

解:交叉輸出BW就好了;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=2e5+10;
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i%2==j%2)cout<<'B';
            else cout<<'W';
        }
        cout<<endl;
    }


    return 0;
}
View Code

C.CodeForces - 1118B 

題意:n個數,求去掉一個數,使得剩下數組中奇數項和 等於 偶數項和 的個數;

解:先求出不去掉的奇數項和 和 偶數項和;

而後遍歷數組;i表明去掉第i個數    而後

奇數項和=(i以前的奇數項和+i以後的偶數項和)

偶數項和=(i以前的偶數項和+i以後的奇數項和)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=2e5+10;
int a[MAXN];
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    int sum1=0;
    int sum2=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(i%2)sum1+=a[i];
        else sum2+=a[i];
    }
    //cout<<"sum1="<<sum1<<' '<<"sum2="<<sum2<<endl;
    int ans=0;
    int newsum1=0;
    int newsum2=0;
    for(int i=1;i<=n;i++){
        if(i%2){
            sum1-=a[i];
            if(sum1+newsum2==sum2+newsum1)ans++;
            newsum1+=a[i];
        }
        else {
            sum2-=a[i];
            if(sum1+newsum2==sum2+newsum1)ans++;
            newsum2+=a[i];
        }
    }
    cout<<ans<<endl;


    return 0;
}
View Code

B.CodeForces - 1221A

題意:給你n個數,每兩個同樣的數能夠合併成這個數的兩倍,問可否合成2048;

2048遊戲~;

解:桶排序;把小於等於2048的數進行桶排序,大於2048就不可能合成了;

而後從1開始遍歷到2048(1024便可),num[i]>=2?num[i*2]+=num[i]/2:continue;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e3+10;
int a[MAXN];
int num[3000];
int main(){
    ios::sync_with_stdio(false);
    int T,n;
    cin>>T;
    while(T--){
        cin>>n;
        memset(num,0,sizeof(num));
        for(int i=1;i<=n;i++){
            cin>>a[i];
            if(a[i]<=2048){
                num[a[i]]++;
            }
        }
        for(int i=1;i<=2048;i++){
            if(num[i]>=2){
                num[i*2]+=num[i]/2;
            }
        }
        if(num[2048])cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }


    return 0;
}
View Code

A.CodeForces - 1118A

題意:兩種水瓶,1L a元,2L b元,問須要n L水最少須要花費多少;

解:直接比較1L和2L 的性價比,而後照着買;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a,b;

int main(){
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--){
        cin>>n>>a>>b;
        if(a*2<=b){
            cout<<n*a<<endl;
        }
        else{
            ll ans=0;
            ans+=n/2*b;
            if(n%2){
                ans+=a;
            }
            cout<<ans<<endl;
        }
    }


    return 0;
}
View Code

 

轉載於:https://www.cnblogs.com/lin1874/p/11564880.html