第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛(同步赛)

没注意开始时间,结果开赛的时候还在和小伙伴快乐剧本杀??
不过补题体验还可以,难得的一场稍简单的比赛,好像除了博弈论基本都是模拟题了(bushi

A.切蛋糕

简要题解

由题可得,要求每个人分得的蛋糕与1/k的绝对值差值不能大于1/2^10,因为每次切蛋糕都是对半分,首先考虑最好算的特殊状态,如果存在一种分法是分给每一个人的蛋糕大小相等,且和1/k的差值满足题意,那这样就不再需要考虑最优拆分策略了,由于总操作限制是不大于6000,事实证明在这个操作限制下确实存在这样一种策略一定满足。
证明如下:

题解代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main(void)
{
    int k;
    cin >> k;
    cout <<k+(1<<10)-1<< endl;
    for(int i=0;i<10;i++)
    {
        for(int j=0;j<(1<<i);j++)
        {
            cout<<1<<" "<<i<<endl;
        }
    }
    int num=1024/k;
    for(int i=1;i<=k;i++)
    {
        cout<<2<<" "<<num<<" ";
        for(int j=1;j<=num;j++)
        {
            cout<<"10 ";
        }
        cout<<"\n";
    }
     
    return 0;
}

B.小宝的幸运数组

简要题解

题解代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
typedef long long LL;
typedef pair<int,int>PII;
const int N=100010;
LL dp[N],sz[N];
unordered_map<LL,LL>mp;
int main(void)
{
    LL t;
    cin>>t;
    while(t--)
    {
        int n,k;
        cin>>n>>k;
        mp.clear();
        for(int i=1;i<=n;i++)cin>>sz[i],sz[i]%=k;
        mp[0]=0;
        LL num=0,ans=-1;
        for(int i=1;i<=n;i++)
        {
            num=(num+sz[i])%k;
            if(mp[num]||num==0)
            {
                ans=max(ans,i-mp[num]);
            }
            else mp[num]=i;
        }
        cout<<ans<<endl;
    }
    //system("pause");
    return 0;
}

C.上进的凡凡

简要题解

题解代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
typedef long long LL;
typedef pair<int,int>PII;
const int N=100010;
LL dp[N],sz[N];
int main(void)
{
    LL t;
    t=1;
    while(t--)
    {
        int n;
       cin>>n;
       for(int i=1;i<=n;i++)
       {
           cin>>sz[i];
       }
       LL ans=1;
       for(int i=1;i<=n;i++)
       {
           dp[i]=1;
           if(i==1)continue;
           if(sz[i]>=sz[i-1])dp[i]+=dp[i-1];
           ans+=dp[i];
       }
       cout<<ans<<endl;
    
    }
    //system("pause");
    return 0;
}

D.Seek the Joker I

简要题解

题解代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
typedef long long LL;
typedef pair<int,int>PII;
const int N=100010;
LL dp[N],sz[N];
int main(void)
{
    LL t;
    cin>>t;
    while(t--)
    {
       int n,k;
       cin>>n>>k;
       if((n-1)%(k+1)!=0) cout<<"yo xi no forever!\n";
       else cout<<"ma la se mi no.1!\n";
    }
    //system("pause");
    return 0;
}

E.Seek the Joker II

简要题解

题解代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <cstdio>
#include <cmath>
using namespace std;
int main(void)
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        int a=m-1,b=n-m;
        if(a>b)swap(a,b);
        double now=(sqrt(5.0)+1)/2;
        if((int)(now*(b-a))==a)cout<<"ma la se mi no.1!"<<endl;
        else cout<<"yo xi no forever!"<<endl;

    }
    //system("pause");
    return 0;
}

F.成绩查询ing

简要题解

纯模拟题,注意不要tle就行了

题解代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <cstdio>
#include <vector>
using namespace std;
string a,b;
struct node
{
    string name;
    int grade;
    int sex;
    int id;
}sz[100010];
unordered_map<string,int>mp;
vector<string>v[110];
int main(void)
{
    ios::sync_with_stdio(false);
    int n,m;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>sz[i].name>>sz[i].grade>>sz[i].sex>>sz[i].id;
        v[sz[i].grade].push_back(sz[i].name);
        mp[sz[i].name]=i;
    }
    for(int i=0;i<=100;i++)sort(v[i].begin(),v[i].end());
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        int op;
        cin>>op;
        if(op==1)
        {
            string str;
            cin>>str;
            int pos=mp[str];
            cout<<sz[pos].grade<<" "<<sz[pos].id<<" "<<sz[pos].sex<<endl;
        }
        else
        {
            int x;
            cin>>x;
            for(int j=0;j<v[x].size();j++)
            {
                cout<<v[x][j]<<"\n";
            }
        }
    }
    //system("pause");
    return 0;
}

G.贪吃的派蒙

简要题解

题解代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
const int N=100010;
LL a[N];
int main(void)
{
    int t;
    cin>>t;
    while(t--)
    {
        LL n,k,maxi=0,mini=0,flag=0,pre=0,sum=0,pre_num=0;
        cin>>n>>k;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            sum+=a[i];
            flag=max(flag,a[i]);
        }
        for(int i=1;i<=n;i++)
        {
            if(a[i]==flag)break;
            pre+=a[i];
            pre_num++;
        }
        LL l=0,r=1e8;
        while(l<r)
        {
            LL mid=l+r+1>>1;
            if((mid*((n-1)+flag)+pre_num)<=k)l=mid;
            else r=mid-1;
        }
        if((l*((n-1)+flag)+pre_num<=k)&&(l*sum+pre>=k))cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    //system("pause");
    return 0;
}

H.数羊

简要题解

题解代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
typedef long long LL;
typedef pair<int,int>PII;
const int N=100010,mod=998244353;
LL f[N],sz[N],ans,t;
LL qmi(LL a,LL b,LL mod)
{
    LL res=1;
    while(b)
    {
        if(b&1)res=res*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return res;
}
int main(void)
{
    cin>>t;
    while(t--)
    {
        LL n,m;
        cin>>n>>m;
        if(m==0)
        {
            if(n==1)cout<<2<<endl;
            else cout<<(n+2)%mod<<endl;
        }
        else if(m==1)cout<<n*2%mod<<endl;
        else
        {
            LL res=qmi(2,n,mod);
            cout<<res<<endl;
        }
         
    }
    return 0;
}

I.买花

简要题解

签到题,预处理出21,22…2^15次,判断一下能否整除

题解代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
typedef long long LL;
typedef pair<int,int>PII;
int main(void)
{
    LL t;
    cin>>t;
    vector<LL>v;
    LL now=1,pd=1;
    for(int i=1;i<=15;i++)
    {
        if(i!=1)v.push_back(now);
        pd*=2;
        now+=pd;
    }
    while(t--)
    {
       LL n;
       cin>>n;
       int flag=0;
       for(int i=0;i<v.size();i++)
       {
           if(n%v[i]==0)
           {
               flag=1;
               break;
           }
       }
       if(flag)cout<<"YE5"<<endl;
       else cout<<"N0"<<endl;
    }
    //system("pause");
    return 0;
}

J.这是一题简单的模拟

简要题解

模拟题,unordered_map处理一下就行了

题解代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
using namespace std;
const int N=330,M=330*330;
int mz[N][N];
int n,m,sz[N*2];
unordered_map<int,int>mp;
int main(void)
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        x++,y++;
        mz[x][y]=z;
        mz[y][x]=z;
    }
    int q;
    cin>>q;
    int ans=-1;
    while(q--)
    {
        int cnt=0;
        cin>>cnt;
        mp.clear();
        sz[1]=1;
        for(int i=2;i<=cnt+1;i++)
        {
            cin>>sz[i];
            sz[i]++;
        }
        sz[cnt+2]=1;
        int flag=0,res=0;
        int tot=0;
        for(int i=2;i<=cnt+2;i++)
        {
            if(mz[sz[i-1]][sz[i]]==0)
            {
                flag=1;
                break;
            }
            res+=mz[sz[i-1]][sz[i]];
            if(i!=1&&mp[sz[i]])
            {
                flag=1;
                break;
            }
            mp[sz[i]]=1;
            if(sz[i]!=1)tot++;
        }
        if(flag)continue;
        if(tot!=n)continue;
        if(ans==-1)ans=res;
        else ans=min(ans,res);
    }
    cout<<ans;
   // system("pause");
    return 0;
}

K.黑洞密码

简要题解

签到题,把字母和数字分开存储,字母为a[i],数字b[i],4个一轮考虑,a[i]后推b[i]个再反转就行

题解代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
using namespace std;
const int N=330,M=330*330;
string a,b;
int main(void)
{
    string str;
    cin>>str;
    for(int i=0;i<str.size();i++)
    {
        if(str[i]>='0'&&str[i]<='9')b+=str[i];
        else a+=str[i];
    }
    string temp;
    for(int i=0;i<16;i++)
    {
        for(int j=0;j<(b[i]-'0');j++)
        {
            if(a[i]=='z')a[i]='B';
            else if(a[i]=='Z')a[i]='b';
            else a[i]+=1;
        }
        temp+=a[i];
        if(i%4==3)
        {
            for(int j=3;j>=0;j--)cout<<temp[j];
            temp="";
        }
    }
    //system("pause");
    return 0;
}

L.建立火车站

简要题解

题解代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
typedef long long LL;
typedef pair<int,int>PII;
const int N=100010,mod=998244353;
LL sz[N];
struct node
{
    LL num,l,r,res;
};
struct cmp
{
    bool operator()(const node&A,const node&B)
    {
        return A.num<B.num;
    }
};
int main(void)
{
    LL t;
    t=1;
    while(t--)
    {
        int n,k;
        cin>>n>>k;
        priority_queue<node,vector<node>,cmp>q;
        int flag1=0;
        for(int i=1;i<=n;i++)
        {
            cin>>sz[i];
            if(i>=2&&sz[i]!=sz[i-1])flag1=1;
        }
        sort(sz+1,sz+n+1);
        for(int i=2;i<=n;i++)
        {
            if(sz[i]-sz[i-1]>1)q.push({sz[i]-sz[i-1],sz[i-1],sz[i],1});
        }
        int cnt=0;
        while(q.size())
        {
            if(cnt==k)break;
            cnt++;
            node u=q.top();
            q.pop();
            LL jg=u.r-u.l;
            LL po=(jg%(u.res+1))==0?jg/(u.res+1):jg/(u.res+1)+1;
            if(po==1)continue;
            q.push({po,u.l,u.r,u.res+1});
        }
        if(!q.size())cout<<1<<endl;
        else cout<<q.top().num<<endl;

    }
    //system("pause");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值