浙江财经大学信工学院程序设计竞赛题解

FightingHeart FightingHeart     2022-08-16     543

关键词:

代码为本人出于爱好 验题时所写,如有错误,敬请指出。

题面$pdf$为本人排版,不到之处,还请海涵。 

联系方式$QQ$:$774388357$  浙江财经大学 $14$软件工程 周甄陶

相关阅读:记萌新赛的命题过程与踩气球过程

正赛题面:https://pan.baidu.com/s/1jIQASxo

热身赛题面:https://pan.baidu.com/s/1mi4mjMg

热身赛$pdf$密码:IbcS3jJkkOsxiMCYfF6v

弱校现场赛$Rank$:https://pan.baidu.com/s/1kVBFGMV

热身赛$Problem$ $D$:圆覆盖

首先,如果$x$的跨度大于$400000$,一定无解,因为圆半径最多是$100000$。剩下的情况可以枚举计算,枚举横坐标$x$,统计横坐标为$x$的被所有圆覆盖的整点有几个,每个圆覆盖的整点都是一段区间,也就是计算区间交。

#include<bits/stdc++.h>
using namespace std;
 
long long x[110],y[110],r[110];
int n;
long long xmin,xmax,ans;
long long INF=10000000000;
double eps=1e-5;
 
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>x[i]>>y[i]>>r[i];
    xmin=x[1]-r[1];
    xmax=x[1]+r[1];
    for(int i=2;i<=n;i++)
    {
        xmin=min(xmin,x[i]-r[i]);
        xmax=max(xmax,x[i]+r[i]);
    }
 
    if(xmax-xmin>400000)
    {
        printf("0\n");
        return 0;
    }
 
    for(long long xx=xmin;xx<=xmax;xx++)
    {
        bool fail=0;
        long long L=-INF,R=INF;
 
        for(int i=1;i<=n;i++)
        {
            if(x[i]-r[i]>xx) fail=1;
            if(x[i]+r[i]<xx) fail=1;
 
            long long p=(long long)sqrt(r[i]*r[i]-(xx-x[i])*(xx-x[i]));
            long long rr=y[i]+p;
            long long ll=y[i]-p;
 
            if(ll>R) fail=1;
            if(rr<L) fail=1;
            if(fail) break;
 
            L=max(L,ll); R=min(R,rr);
        }
        if(fail) continue;
        ans=ans+R-L+1;
    }
 
    cout<<ans;
    return 0;
}
View Code

$Problem$ $A$:祝大家院赛取得好成绩

这题不算题。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
 
int main()
{
    printf("AC\n");
    return 0;
}
View Code

$Problem$ $B$:进击的会长

对于每个数,去前面寻找是否出现过,没出现过答案加$1$。

#include<bits/stdc++.h>
using namespace std;
 
int f[1010],n;
 
int main()
{
    int ans=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        if(f[x]==0)
        {
            ans++;
            f[x]=1;
        }
    }
    cout<<ans;
    return 0;
}
View Code

$Problem$ $C$:博弈

从规则来看,每次取卡必然取走一张$A$卡,当$A$卡没有的时候,游戏结束。因此只需判断$A$卡的张数是奇数还是偶数。

#include<bits/stdc++.h>
using namespace std;
 
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    if(n%2==1) puts("Yes");
    else puts("No");
    return 0;
}
View Code

$Problem$ $D$:来自上级的压迫

数据范围较小,可以暴力匹配做,开一个数组记录下哪些位置被屏蔽了。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
  
char s[1010],t[15];
int n,lens,lent,flag[1010];
  
bool Equ(char a,char b)
{
    if(b=='_') return 0;
    if(a==b||a+'a'-'A'==b||a-'a'+'A'==b) return 1;
    return 0;
}
  
void work(int x)
{
    if(x+lent-1>=lens) return;
    for(int i=0;i<lent;i++) if(!Equ(t[i],s[i+x])) return;
    for(int i=0;i<lent;i++) flag[i+x]=1;
}
  
int main()
{
    scanf("%s",s);
    scanf("%d",&n);
    memset(flag,0,sizeof flag);
    lens=strlen(s);
    for(int p=0;p<n;p++)
    {
        scanf("%s",t); lent=strlen(t);
        for(int i=0;i<lens;i++) work(i);
    }
  
    for(int i=0;i<lens;i++)
    {
        if(flag[i]) printf("*");
        else printf("%c",s[i]);
    }
    printf("\n");
  
    return 0;
}
View Code

$Problem$ $E$:$zzt$发明了永动机

模拟,按题意说的操作一遍就可以了。

#include<bits/stdc++.h>
using namespace std;
 
int n,m,x,y;
int a[1010];
int p,q,cnt;
 
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
 
    if(n==0||m<1000)
    {
        cout<<0<<" "<<m<<endl;
        return 0;
    }
 
    cnt=0;
    int now=1;
    while(1)
    {
        if(m<1000) break;
        m=m-1000; p=q=0;
        while(1)
        {
            if(now>n) break;
            if(a[now]==0) cnt++,q++;
            else cnt++,p++;
            if(p==12||q==3)
            {
                m=m+20*(1+p)*p/2;
                break;
            }
            now++;
        }
        if(now>n) break;
        now++;
        if(now>n) break;
    }
 
    cout<<cnt<<" "<<m<<endl;
    return 0;
}
View Code

$Problem$ $F$:$zzt$的守望

贪心,统计一下每个训练营分别有多少人,排序,从人数多的训练营开始取人。

#include<bits/stdc++.h>
using namespace std;
 
int n,m,x;
int a[1010];
bool cmp(int a,int b) {return a>b;}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>x, a[x]++;
    sort(a,a+100,cmp);
    int ans=0;
    for(int i=0;i<100;i++)
    {
        ans=ans+min(a[i],m)*min(a[i],m);
        m=m-min(a[i],m);
        if(m<=0) break;
    }
    cout<<ans<<endl;
    return 0;
}
View Code

$Problem$ $G$:黑鸡打$BOSS2.0$

模拟题,按照题意说的做。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
  
int n,atk,def,hp,lv=0,eee,ans,f[35];
bool fail=0;
  
int main()
{
    f[0]=1; for(int i=1;i<=30;i++) f[i]=2*f[i-1];
    cin>>n; lv++; atk=5*lv; def=5*lv; hp=lv*100; eee=0;
    for(int i=1;i<=n;i++)
    {
        int h,a,d,e; cin>>h>>a>>d>>e;
        if(i%2==1)
        {
            int cnt=0; int res=-1;
            while(1)
            {
                cnt++;
                if(cnt%3==0) h=h-max(0,2*(atk-d)); else h=h-max(0,atk-d);
                if(h<=0) {res=1; break;}
                hp=hp-max(0,a-def); if(hp<=0) {res=0; break;}
            }
            if(res==0) {fail=1, ans=i; break; }
        }
        else
        {
            int res=-1;
            while(1)
            {
                h=h-max(0,6*atk/5-d); if(h<=0) {res=1; break;}
                hp=hp-max(0,a-def); if(hp<=0) {res=0; break;}
            }
            if(res==0) {fail=1, ans=i; break; }
        }
        if(fail==1) break;
        else
        {
            eee=eee+e;
            while(1) { if(eee>=f[lv]) eee-=f[lv],lv++,atk=5*lv, def=5*lv, hp=lv*100; else break;}
        }
    }
  
    if(fail) printf("%d\n",ans);
    else printf("oh my hero heiji\n");
 
    return 0;
}
View Code

$Problem$ $H$:$Quick$ $Pow$

裸的快速幂,题面给出了教学。

#include<bits/stdc++.h>
using namespace std;
 
long long a,b;
long long mod=2016;
 
long long POW(long long a,long long b)
{
    long long res=1;
    while(b)
    {
        if(b%2==1) res=res*a%mod;
        b=b/2; a=a*a%mod;
    }
    return res;
}
 
int main()
{
    cin>>a>>b;
    printf("%lld\n",POW(a,b));
    return 0;
}
View Code

$Problem$ $I$:$Easy$ $Search$

广搜,数据范围较小,可以暴力通过,每次扫一遍图往外标记即可。

#include<bits/stdc++.h>
using namespace std;
 
int n,m,k;
char s[120][120];
int sx,sy,flag[120][120];
int ans=0;
 
void work(int a,int b,int c)
{
    if(a<0||b<0) return ;
    if(a>=n||b>=m) return ;
    if(s[a][b]=='#') return ;
    flag[a][b]=c;
    if(s[a][b]=='+') ans=1;
}
 
int main()
{
    memset(flag,-1,sizeof flag);
    cin>>n>>m>>k;
    for(int i=0;i<n;i++) cin>>s[i];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(s[i][j]=='@') sx=i,sy=j;
        }
    }
    flag[sx][sy]=0;
    for(int p=1;p<=k;p++)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(flag[i][j]!=p-1) continue;
                work(i-1,j,p);
                work(i+1,j,p);
                work(i,j-1,p);
                work(i,j+1,p);
                if(ans) break;
            }
            if(ans) break;
        }
        if(ans) break;
    }
    if(ans) printf("YES\n");
    else printf("NO\n");
 
    return 0;
}
View Code

$Problem$ $J$:初中平面几何

连接$OA$,$OD$,$OE$,将问题转化为扇形面积减去两个三角形面积。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
 
 
int main()
{
    int r,a,b;
    cin>>r>>a>>b;
    double pi=acos(-1.0);
    double jiao1=asin(1.0*b/r);
    double jiao3=asin(1.0*a/r);
    double jiao2=pi/2-(jiao1+jiao3);
    double ss=jiao2/2*r*r;
    double sda=0.5*sin(jiao2)*r*r;
    double sgong=ss-sda;
    double q=sqrt(1.0*r*r-1.0*a*a);
    double p=sqrt(1.0*r*r-1.0*b*b);
    double sxi=0.5*(p-a)*(q-b);
    printf("%.2lf\n",sgong+sxi);
    return 0;
}
View Code

$Problem$ $K$:天天摸球身体棒

概率。和$p$无关,即无论第几个人,概率都是和第一个人一样的,总的方案数有$sum!$种,第$p$个位置为颜色为$q$的方案数有$(sum-1)!*a[q]$种。化简之后,答案就是$a[q]/sum$。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
 
int n,p,q,fz,fm;
 
int gcd(int a,int b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}
 
int main()
{
    cin>>n>>p>>q;
    fz=fm=0;
    for(int i=1;i<=n;i++)
    {
        int x; cin>>x;
        if(i==q) fz=x;
        fm=fm+x;
    }
 
    int g=gcd(fz,fm);
    cout<<fz/g<<"/"<<fm/g<<endl;
 
    return 0;
}
View Code

$Problem$ $L$:$GayDong$的礼物

$dp$,分别记录到第$i$位$L$、$LO$、$LOV$、$LOVE$的方案数即可递推。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
 
int n,a,b,c,d;
char s[100010];
int mod=1e9+7;
 
int main()
{
    cin>>n>>s;
    a=b=c=d=0;
    for(int i=0;s[i];i++)
    {
        if(s[i]=='L') a=(a+1)%mod;
        else if(s[i]=='O') b=(b+a)%mod;
        else if(s[i]=='V') c=(c+b)%mod;
        else if(s[i]=='E') d=(d+c)%mod;
    }
    cout<<d<<endl;
    return 0;
}
View Code

$Problem$ $M$:数字旋转

$dp$,$dp[i][j]$表示前$i$个数,旋转次数小于等于$j$次的情况下获得的最大价值,枚举第$i$个数字旋转了几次即可递推。该问题与背包问题类似,可以学一下背包问题九讲

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
 
int n,m,f[15];
long long dp[110][1010];
long long v[15];
 
int main()
{
    f[0]=1; for(int i=1;i<=10;i++) f[i]=10*f[i-1];
    memset(dp,0,sizeof dp);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        long long x; cin>>x;
        long long t=x; int len=0; while(t) len++,t=t/10;
        v[0]=x; for(int j=1;j<=10;j++) v[j]=(v[j-1]%f[len-1])*10+v[j-1]/f[len-1];
        for(int j=0;j<=10;j++)
        {
            for(int k=j;k<=m;k++)
            {
                dp[i][k]=max(dp[i][k],dp[i-1][k-j]+v[j]);
            }
        }
    }
    cout<<dp[n][m];
    return 0;
}
View Code

2017年浙江工业大学之江学院程序设计竞赛决赛i:qwbvs去污棒(可持久化trie+离线)

问题I:qwbVS去污棒时间限制: 2Sec  内存限制: 256MB 提交: 74  解决: 26 [提交][状态][讨论版] 题目描述 qwb表白学姐失败后,郁郁寡欢,整天坐在太阳底下赏月。在外人看来,他每天自言自语,其实他在和... 查看详情

2017年“达内杯”台州学院第十届大学生程序设计竞赛非官方题解

 感谢crq兄弟搞了这次校赛,让我认识到了自己傻的时候确实傻的可爱。crq棒棒哒,我们OJ也十年多了,不容易啊。大家能用得上的时候确实要练好基本功啊。5259:多项式值统计  TimeLimit(Common/Java):1000MS/3000MS  Memor... 查看详情

[2017年第0届浙江工业大学之江学院程序设计竞赛决赛i]qwbvs去污棒(并查集,按秩合并,最小生成树,lca)

题目链接:http://115.231.222.240:8081/JudgeOnline/problem.php?cid=1005&pid=8题意:中文题面。手动画一下会发现所求边必然存在于最大生成树上,那么就可以首先构造一棵最大生成树。问题转化成一棵树上求两个点之间的链上的最短边,... 查看详情

湖南中医药大学信息科学与工程学院第四届大学生程序设计竞赛——正式赛题解(代码片段)

目录问题A:X星人的统计问题B:X星人的报数问题C:X星人的迷宫问题D:X星人的高考问题E:X星人的匹配问题F:X星人的成绩问题G:X星人的变换问题H:X星人的游戏问题I:X星人的宝石问题J:X星人的车牌问题K:X星人的括号问题L:X星人的翻译问题... 查看详情

全国大学生智能车竞赛赛场准备好,就等同学们入驻展示(代码片段)

...学院6华东赛区南京信息工程大学7山东赛区山东科技大学8浙江赛区湖州学院9总决赛南京信息工程大学▲图4赛道围挡设计▲图5赛场横幅设计▲图6参赛队伍、工作人员、裁判员胸牌设计▲图7参赛选手胸牌▲图8工作人员胸牌▲图9... 查看详情

2017年浙江中医药大学大学生程序设计竞赛(重现赛)h-剪纸

题目描述DDwantstosendagifttohisbestfriendCCasherbirthdayiscoming.However,hecan’taffordexpensivegifts,andheissolazythatheisnotwillingtodocomplexthings.SohedecidestoprepareapapercutforCC’sbirthd 查看详情

江西财经大学第一届程序设计竞赛(代码片段)

A贪玩蓝月题目描述"挤需体验五番钟,里造会挨上这款游戏!"怎么可能嘛!当我是傻子吗!#?%!“”@……于是我就去玩了,然后我果然成功证明,我是正确的,这破游戏,真的很无聊.有多无聊呢,和这道题一样.-------... 查看详情

江西财经大学第一届程序设计竞赛(代码片段)

A:贪玩蓝月题目描述"挤需体验五番钟,里造会挨上这款游戏!"怎么可能嘛!当我是傻子吗!#?%!“”@……于是我就去玩了,然后我果然成功证明,我是正确的,这破游戏,真的很无聊.有多无聊呢,和这道题一样.------------------------... 查看详情

第十六届全国大学生智能车竞赛浙江赛区选拔赛成绩汇总(代码片段)

简介:本文对于第十六届全国大学生智能车浙江赛区比赛成绩进行汇总分析,并对今年四轮组完赛率较低的情况进出初步分析。关键词:智能车竞赛,浙江赛区,成绩分析 §01比赛成绩  第十六届全国大学... 查看详情

2017年浙江中医药大学大学生程序设计竞赛(重现赛)d-cc的神奇背包

题目描述CCisasmartgirlandsheiscuriousabouteverything.Onedayshestartstoanalyzeherlifestyleandfindsoutthatsheeitherfeelshappyorunhappyinanyday,thenshecollectshermooddataandmakesnumericalrepresentation.Shewr 查看详情

网世助力浙江大学药学院hpc建设

用户简介浙江大学药学院具有悠久的历史和学术传承,其前身浙江公立医药专门学校药科和国立浙江大学药学系分别成立于1913年和1944年,是国人最早创办的现代药学教育和高等药学教育院系之一,为中国现代药学和制药科技的发展... 查看详情

数学题解《acm国际大学生程序设计竞赛题目与解读》(代码片段)

...计划红书《题目与解读》第一章数学题解《ACM国际大学生程序设计竞赛题目与解读》全书目录:《题目与解读》红书训练笔记目录《ACM国际大学生程序设计竞赛题目与解读》目录红书《题目与解读》第一章数学题解《ACM国际... 查看详情

2017-5-19-train:2017年浙江理工大学程序设计竞赛校赛

ProblemA:回文(签到题)Description小王想知道一个字符串是否为ABA’型字符串。ABA’型字符串的定义:S=ABA’,A,B,A’都是原字符串的子串(不能是空串),A’的意思是A的反转串,B不一定要和A或A’不同。符合ABA&rs... 查看详情

第十七届智能车竞赛安徽赛区报名队伍数量

...单车完全模型四轮电磁智能视觉平衡信标极速越野1安徽财经大学1  1 11112安徽大学1111 111 3安徽大学江淮学院1  1 1  14安徽工程大学1111111115安徽工业大学11111 11 6安徽建筑大学11 1 1 117安徽科技学院1 11 11 18... 查看详情

北京化工大学2018年10月程序设计竞赛部分题解(a,c,e,h)(代码片段)

目录北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H)竞赛事件相关竞赛链接竞赛题目总结北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H)竞赛事件相关竞赛链接虽然我发这个随笔的时候估计已经比完了,不过还是... 查看详情

2017年浙江中医药大学大学生程序设计竞赛(重现赛)a-不存在的树

题目描述kotomi有一棵树。树上有n个房子,编号1-n,每个房子有一个快乐值。kotomi想知道从a房子到b房子路径上的最大快乐值或者路径山疙瘩快乐值的和。并且kotomi可以改变任意一个房子的快乐值。具体如下(1)0ab:查询a到b路径上的... 查看详情

智能车竞赛技术报告|节能信标组-浙江大学-浙大三队(代码片段)

参赛学校:浙江大学       队伍名称:浙大三队       参赛队员:朱呈翔、余江涵、张博群带队教师:姚维、韩涛       第一章引言  全国大学生智能汽车竞赛是一项以“立足培养、重在参与、鼓励探索、... 查看详情

计算机学院大学生程序设计竞赛(2015’11)1004质方数

1004质方数TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)ProblemDescription  小明天生对数字比较敏感,3岁的时候就能背诵圆周率一百位。  现在,小明慢慢长大了,但依然很喜欢数字,最近... 查看详情