Codeforces Round #615 (Div. 3) (題解)

深入人心發表於2020-10-06

在這裡插入圖片描述
題目大意:
給你三個數,用另外一個數n加到這三個數中去,看能不能使得他們相等。
思路:
先對齊,即都先加到三個數中最大數的大小,然後看剩餘的數模 3 3 3是否為0。
程式碼:

#include<iostream>
#include<vector>
#include<cstring>
#include<map>
#include<set>
#include<algorithm>
using namespace std;

typedef long long int ll;
void solved(){
    vector<ll>ve;
    ll a,b,c,n;cin>>a>>b>>c>>n;
    ve.push_back(a);ve.push_back(b);ve.push_back(c);
    sort(ve.begin(),ve.end());
    ll x = (ve[2] - ve[0]) + (ve[2] - ve[1]);
    if((n - x) >= 0 && (n - x) % 3 == 0){
        cout<<"YES"<<endl;
    }else{
        cout<<"NO"<<endl;
    }
}
int main(){
    int t;cin>>t;
    while(t--)
        solved();
    return 0;
}

在這裡插入圖片描述
在這裡插入圖片描述
題目大意:
你在座標 ( 0 , 0 ) (0,0) (0,0)然後有 n n n個箱子的座標,問你能不能拿到所有的箱子,你每次只能向上(U)或者向右移動( R),找到最小移動步數,並且移動結果字典序最小,如果不能全部拿到輸出NO。
思路:
方便處理先按照橫縱座標升序,然後模擬即可。優先處理向右移動再向上即可滿足字典序最小。
程式碼:

#include<iostream>
#include<vector>
#include<cstring>
#include<map>
#include<set>
#include<algorithm>
using namespace std;

const int maxn = 1e4;
typedef long long int ll;
struct node{
    int x,y;
}a[maxn];
bool cmp(node a,node b){
    if(a.x != b.x)
    return a.x < b.x;
    return a.y < b.y;
}
void solved(){
    int n;cin>>n;
    for(int i = 1; i <= n; i++)cin>>a[i].x>>a[i].y;
    sort(a + 1,a + 1 + n,cmp);
    int lx = a[1].x;
    int ly = a[1].y;
    string ans;
    for(int i = 1; i <= lx; i++)ans += "R";
    for(int i = 1; i <= ly; i++)ans += "U";
    for(int i = 2; i <= n; i++){
        if(a[i].x >= lx && a[i].y >= ly){
            for(int t = lx; t < a[i].x; t++)ans += "R";
            for(int t = ly; t < a[i].y; t++)ans += "U";
            lx = a[i].x;ly = a[i].y;
        }else{
            cout<<"NO"<<endl;return ;
        }
    }
    cout<<"YES"<<endl;
    cout<<ans<<endl;
}
int main(){
    int t;cin>>t;
    while(t--)
        solved();
    return 0;
}

在這裡插入圖片描述
題目大意:
給定 n n n是否存在 a ∗ b ∗ c = n a*b*c=n abc=n
思路:
質因數分解即可。
程式碼:

#include<iostream>
#include<vector>
#include<cstring>
#include<map>
#include<set>
#include<algorithm>
using namespace std;

typedef long long int ll;
void solved(){
    ll n;cin>>n;
    vector<int>ve;
    int cnt = 0;
    for(int i = 2; i * i <= n; i++){
        if(n % i == 0){
            n /= i;
            ve.push_back(i);
            cnt++;
            if(cnt == 2){
                ve.push_back(n);
                break;
            }
        }
    }
    if(cnt == 2 && ve[1] != ve[2]){
        cout<<"YES"<<endl;
        for(int i = 0; i < ve.size(); i++)cout<<ve[i]<<" ";cout<<endl;
    }else cout<<"NO"<<endl;
}
int main(){
    int t;cin>>t;
    while(t--)
        solved();
    return 0;
}

在這裡插入圖片描述
在這裡插入圖片描述
題目大意:
給你 q q q個詢問和一個數 x x x,每次詢問後會把詢問的數加入一個陣列(一開始是0),你可以對陣列的任意元素 − x , + x -x,+x x,+x,問你每個詢問最大的 m e x mex mex
思路:
如果答案已經滿足了,那麼下一個只會比上一個更優,注意到 x x x不是很大,我們可以把每次詢問的數構造在 [ 0 , x − 1 ] [0,x-1] [0,x1]範圍內並且對它計數,即 y m o d x y mod x ymodx因為 + x , − x +x,-x +x,x本質就是mod x x x,然後找答案就行了。具體看程式碼吧,感覺程式碼更加清晰。
程式碼:

#include<iostream>
#include<vector>
#include<cstring>
#include<map>
#include<set>
#include<algorithm>
using namespace std;

typedef long long int ll;
int mp[500000];
void solved(){
    int q,x;cin>>q>>x;
    int ans = 0;
    for(int i = 1; i <= q; i++){
        int y;cin>>y;
        mp[y % x]++;//計數
        while(mp[ans % x]){//答案可以增加
            mp[ans % x]--;//確定這個數,即這個數失去下次給它加的意義
            ans++;//答案增加
        }
        cout<<ans<<endl;
    }
}
int main(){
    solved();
    return 0;
}

相關文章