A. Rudolph and Cut the Rope

题意:给定n个钉子,钉子的高度为x,所连的线为y,所有钉子都连着一个糖果,问需要减几个绳子糖果可以落地

思路:只需判断绳子的长度小于钉子的长度的钉子有几个

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
set<int>st;

void  solve(){
    int n;
    cin>>n;
    int cnt=0;
    while (n--){
        int l,r;

        cin>>l>>r;
        if(l-r>0)cnt++;
    }
    cout<<cnt<<endl;
}

signed main(){
    int t;
    cin>>t;
    while (t--){
        solve();
    }
}

B. Rudolph and Tic-Tac-Toe

题意:五子棋的弱化版(五变成三),问谁赢了

思路:暴力判断

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,k;
#define endl '\n'
void solve(){
    string s[3];
    for(int i=0;i<3;i++)cin>>s[i];
    if(s[0][0]!='.'&&s[0][0]==s[1][1]&&s[0][0]==s[2][2]){
        cout<<s[0][0]<<endl;
        return;
    }
    if(s[0][2]!='.'&&s[0][2]==s[1][1]&&s[0][2]==s[2][0]){
        cout<<s[0][2]<<endl;
        return;
    }
    for (int i = 0; i <3 ; ++i) {
        if(s[i][0]!='.'&&s[i][0]==s[i][1]&&s[i][0]==s[i][2]){
            cout<<s[i][0]<<endl;
            return;
        }
        if(s[0][i]!='.'&&s[0][i]==s[1][i]&&s[0][i]==s[2][i]){
            cout<<s[0][i]<<endl;
            return;
        }
    }
    cout<<"DRAW\n";

}

int main(){
    int t;
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>t;//
    while(t--){
        solve();
    }

}

C. Rudolf and the Another Competition

题意:ACM赛制n个人,m道题,每道题的解决时间为a[i],问一号选手的排名是多少(相同1号则靠前)

思路:将解决时间排序,然后算出解决问题的总时间与总个数(前缀,个数则是解决一个问题,时间减少-1e9),加入pair,求得答案

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
bool cmp(pair<int,int>x,pair<int,int>y){
    if(x.second!=y.second)
    return x.second<y.second;
    return x.first<y.first;
}
void solve(){
    int n,m,h;
    cin>>n>>m>>h;
    vector<pair<int,int>>q;
    for (int i = 0; i <n ; ++i) {
        vector<int>g(m);
        for (int j = 0; j <m ; ++j) {
            cin>>g[j];
        }
        sort(g.begin(),g.end());
        for (int j = 1; j <g.size() ; ++j) {
            g[j]+=g[j-1];
        }
        int s=0;
        int p=0;

        for (int j = 0; j <g.size() ; ++j) {
            int gg;
            if(j==0)gg=g[j];
            else
            gg=g[j]-g[j-1];

            if(gg+p<=h){
                s-=1e9;
                s+=g[j];
                p+=gg;
            }
            else break;
        }
        q.push_back({i,s});
    }
    sort(q.begin(),q.end(),cmp);
    for (int i = 0; i <n ; ++i) {
        if(q[i].first==0){
            cout<<i+1<<endl;
            return;
        }
    }

}
signed main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

D. Rudolph and Christmas Tree

题意:给n个底边和高一样的三角形,他们的底边的高度不同,问组成集合的面积是多少

思路:排序后,从低向高遍历相似求面积

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve(){
    int d,h,n;
    cin>>n>>d>>h;
    double s=0;
    vector<int>q(n);
    for (int i = 0; i <n ; ++i) {
        cin>>q[i];
    }
    sort(q.begin(),q.end());
    int r=0;
    for (int i = 0; i <n ; ++i) {
        if(q[i]>=r){
            s+=d*h*0.5;
            r=q[i]+h;
        }
        else{
            s+=d*h*0.5;
            s-=(r-q[i])*1.0*(r-q[i]*1.0)/h*d*0.5;
            r=q[i]+h;
        }
    }
    printf("%.7f\n",s);

}
signed main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

E1. Rudolf and Snowflakes (simple version)

题意:雪花问题,给n个顶点,问能否组成雪花,雪花的问题是问这个n是不是,1+x^2+x^3+x^4……(x∈正整数),雪花至少有2层。

思路:easy-version之中n的数据范围很小,1e6,直接暴力求解一下1到1e6之中哪些数被标记。

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
bool  vis[1000006];

void  solve(){
    int n;
    cin>>n;
    if(vis[n]){
        cout<<"YES\n";
    }
    else{
        cout<<"NO\n";
    }

}
signed main(){

    for(int i=2;i<=1000000;i++){
        int s=1,last=1;
        for (int j = 1;  ; ++j) {
            last*=i;
            s+=last;
            if(s>1000000)break;
            if(j>1)
            vis[s]= true;
        }
    }
    int t;
    cin>>t;
    while (t--){
        solve();
    }
}

E2. Rudolf and Snowflakes (hard version)

题意:E2为hard版本的,n的数据范围1e18

思路:我们可以知道如果雪花大于等于三层的话,这个x的范围为2到1e6,然后我们二分1e18,即可标记出哪些成立,加入set,如果不成立,然后我们再特判一下两层雪花的情况,二分一下1e6到1e18的数是否满足这个n

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
set<int>st;

void  solve(){
    int n;
    cin>>n;
    if(st.count(n)){
        cout<<"YES\n";
        return;
    }
    __int128 l=1000000,r=1e9;
    while(l<r){
        __int128 mid=l+r>>1;
        if((mid*mid*mid-1)/(mid-1)>=n)r=mid;
        else
            l=mid+1;
    }
    if((l*l*l-1)/(l-1)==n)cout<<"YES\n";
    else
        cout<<"NO\n";

}
signed main(){
    for(int i=2;i<=1000000;i++){
        __int128 s=1+i+i*i,last=i*i;
        st.insert(s);
        for (int j = 1;; ++j) {
                last*=i;
                s+=last;
                if(s>=(int)1e18)break;
                st.insert(s);
        }
    }
    int t;
    cin>>t;
    while (t--){
        solve();
    }
}
posted on 2023-07-11 09:14  IR101  阅读(14)  评论(0编辑  收藏  举报  来源