信息学院第九届ACM程序设计竞赛题解

 A: 信号与系统

Time Limit: 1000 MS Memory Limit: 65536 KB
Total Submit: 238 Accepted: 44 Page View: 69

Description

上决╇ф正在学习万恶的信号与系统(SAS),各种卷积、傅里叶等恶心的变化。现在,上决╇ф碰到了一个很简单但是很烦人的问题,又一个离散信号,要求出这个信号最大值和最小值出现的次数。上决╇ф现在很忙,这个问题就交给你了。

Input

第一排一个数T( 0 < T <= 100 ),表示测试组数。
每组测试的第一排一个数n(0 < n <= 100),表示这个信号有n个离散点。
接下一排有n个数,对于每一个数Ai,表示该点的信号值的大小,(-100 <= Ai <= 100)。

Output

对于每一组测试输出一排,格式为:"Case #X: A B"(不包括引号),A表示这个信号最大值出现的次数,B表示最小值出现的次数。X代测试表数据编号。Sample Input
2
6
1 1 2 2 3 3
5
79 79 79 79 79Sample Output
Case #1: 2 2
Case #2: 5 5

Status Clarify

膜拜巨巨都学这些了,各种卷积、傅里叶等,Orz

签到题、排序即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
    int n,T,i,iCase=1;
    int a[110];
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        int cnt1=1,cnt2=1;
        for(i=1;i<=n;i++)
        {
            if(a[i]==a[i+1]) cnt1++;
            else break;
        }
        for(i=n;i>=1;i--)
        {
            if(a[i]==a[i-1]) cnt2++;
            else break;
        }
        printf("Case #%d: %d %d\n",iCase++,cnt2,cnt1);
    }
    return 0;
}

 B: 小红开班会

Time Limit: 2000 MS Memory Limit: 65536 KB
Total Submit: 196 Accepted: 24 Page View: 44

Description

小红当了超级一班的辅导员,他召开了一次班会。超级一班共有n个人,但是开完会以后他看了下签到表,上面只有n-1个人的学号。小红想知道哪个人没来,他知道n个人的学号,但是由于人太多,小红找不出来,所以请你帮他找出没来的那个人的学号。

Input

第一行输入一个数字T。表示有T组数据。
每组输入共3行。
第一行1个数n,表示超级一班的人数(2<=n<=100000)
第二行n个数,分别表示n个人的学号(每个数小于2^31,且n个数一定互不相同,两个数字之间以空格隔开)
第三行n-1个数,为签到表上的学号(输入保证每个数都为上一行的n个数之一,且n-1个数一定互不相同)

Output

每组数据输出一行,输出格式为:"Case #x: y"。x表示这是第几组数据。y表示没来参加班会的人的学号。Sample Input
2
3
1 2 3
2 3
4
20121010 20131320 20121111 20111234
20131320 20111234 20121111Sample Output
Case #1: 1
Case #2: 20121010

Status Clarify

签到题、

方法1:排序

方法2:异或即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
    int n,T,i,iCase=1;
    int a[100010],b[100010];
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++) scanf("%d",&a[i]);
        for(i=1;i<n;i++) scanf("%d",&b[i]);
        sort(a+1,a+n+1);
        sort(b+1,b+n);
        int ans;
        for(i=1;i<=n;i++)
        {
            if(a[i]!=b[i])
            {
                ans=a[i];
                break;
            }
        }
        printf("Case #%d: %d\n",iCase++,ans);
    }
    return 0;
}

 C: 小红去看花卉展

Time Limit: 2000 MS Memory Limit: 65536 KB
Total Submit: 23 Accepted: 0 Page View: 109

Description

春天来了,小红跑去看花卉展。花卉展摆了n排花,每排有m盘花卉,从左到右编号为1到m。每盘花卉都有一个标签,上面标明了这盘花卉的价格。

看到这一排一排的数字小红脑海里突然浮现出一个问题:是否存在一个区间[l,r],使得每排花卉区间[l,r]的花卉的价格和相等?如果存在,那么这样的区间最长为多少?

Input

第一行输入一个数字T,表示输入数据组数。
对于每组数据输入:
第一行两个数:n,m(1<=n<=30,1<=m<=10000)
接下来输入n行,每行m个数字。第i行的第j个数,表示第i排的第j盘花卉的价格(输入保证每个数大于等于0且小于2^31)。

Output

对于每组数据,输出一行"Case #x: y",x表示这是输入的第几组数据,y表示满足条件的最长的区间。如果不存在,y为-1。Sample Input
2
1 3
1 2 3
2 3
1 2 3
4 3 1Sample Output
Case #1: 3
Case #2: -1

Status Clarify

后面再补  - -

 D: islands打炉石传说

Time Limit: 1000 MS Memory Limit: 65536 KB
Total Submit: 64 Accepted: 10 Page View: 82

Description

islands最近在完一款游戏“炉石传说”,又名“魔兽英雄传”。炉石传说是一款卡牌类对战的游戏。游戏是2人对战,总的来说,里面的卡牌分成2类,一类是法术牌,另一类是随从牌(所谓随从就是怪物)。

为了简化问题,现在假设随从牌的作用是召唤一个具有一定攻击力的怪物,法术牌的作用是给某个随从增加一定攻击力。随从牌和法术牌的使用都需要消耗一定的法力值。现在islands有10点法力值,手上有n张牌(islands最多有10张牌,否者他将会被爆牌T_T),有些是法术牌,有些是随从牌。islands现在是大劣势,他想要是利用这10点法力值使得召唤出来的所有随从的攻击力总和最高(法力值可以不用完)。注意,任何法术牌都必须使用在某个召唤出来的随从上,也就是如果islands没有召唤过随从,他将不能使用任何法术牌。告诉islands他能召唤的随从的总攻击力最大是多少。

Input

首先输入测试数据组数T(T<=10)
每组数据首先输入一个n(0<=n<=10),表示islands有n张牌接下来n行每行输入3个整数 cost(0<=cost<=10),d(0或者1),w(|w|<=1000)。cost表示该牌的法力值消耗,如果d=0,表示该牌是攻击力为w的随从牌,如果d=1,表示是能给一个随从增加w攻击的法术牌。

Output

对于每组数据输出按照格式“Case #x: a”(不包括冒号)输出一行。其中x表示第x组测试数据,a表示对应的答案。Sample Input
2
1
1 0 100
1
1 1 100Sample Output
Case #1: 100
Case #2: 0

Status Clarify

水题、

方法1:暴力

方法2:01背包

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 10000

int n,s;
int w1[100],v1[100],n1;
int w0[100],v0[100],n0;
int dp[30010];

int main()
{
    int T,i,j,k,iCase=1;
    scanf("%d",&T);
    while(T--)
    {
        n0=n1=0;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            if(b==0)
                w0[++n0]=a,v0[n0]=c;
            else
                w1[++n1]=a,v1[n1]=c;
        }
        int ans=0;
        int ww,vv;
        for(k=1;k<=n0;k++)
        {
            memset(dp,0,sizeof(dp));
            dp[0]=v0[k];
            s=10-w0[k];
            for(i=1;i<=n0+n1;i++)
            {
                if(i==k) continue;
                if(i<=n0) ww=w0[i],vv=v0[i];
                else ww=w1[i-n0],vv=v1[i-n0];
                for(j=s;j>=ww;j--)
                {
                    dp[j]=max(dp[j],dp[j-ww]+vv);
                }
            }
            int tmp=0;
            for(j=0;j<=10;j++) tmp=max(tmp,dp[j]);
            ans=max(ans,tmp);
        }
        printf("Case #%d: %d\n",iCase++,ans);
    }
    return 0;
}

 E: 小红学数学

Time Limit: 1000 MS Memory Limit: 65536 KB
Total Submit: 184 Accepted: 43 Page View: 59

Description

众所周知,小红是一个不折不扣月收入好几E的大土豪,最近小红来swust学习数学,我上决╇ф这个小diaosi岂能错过抱大腿的机会?为什么小红要来swust学数学呢?毕竟钱多人傻,23333333。小红碰到的问题就是这么简单他都不会,求一个数的质因子个数。想抱大腿么?请继续……

Input

第一排一个数T,为测试组数。
每组一排只有一个数字n,(0< n<=10000),测试组数不超过20组。

Output

每组输出一排,"Case #X: "和n的质因子的个数。X代表测试编号。Sample Input
2
10
5Sample Output
Case #1: 2
Case #2: 1

Hint

此题1不属于质数。
质因子:假设A是质数,且B%A==0,那么A就是B的质因子。

Status Clarify

签到题,暴力或者筛素数都行

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 10000

int tot;
int prime[N+10];
bool isprime[N+10];
void init()
{
    tot=0;
    memset(isprime,1,sizeof(isprime));
    isprime[0]=isprime[1]=0;
    for(int i=2;i<=N;i++)
    {
        if(isprime[i]) prime[tot++]=i;
        for(int j=0;j<tot;j++)
        {
            if((ll)i*prime[j]>N) break;
            isprime[i*prime[j]]=0;
            if(i%prime[j]==0)
                break;
        }
    }
}
int main()
{
    init();
    int n,T,i,iCase=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        int ans=0;
        for(int i=0;i<tot;i++)
        {
            if(n%prime[i]==0)
                ans++;
        }
        printf("Case #%d: %d\n",iCase++,ans);
    }
    return 0;
}

 F: 上决╇ф的IDE

Time Limit: 5000 MS Memory Limit: 65536 KB
Total Submit: 27 Accepted: 1 Page View: 25

Description

上决╇ф觉得Code::Blocks的编辑器太难用了,决定自己开发一个编辑器。现在,这个编辑器正处于开发的初期,只能进行剪切和粘贴成对的操作来处理特殊文本。该文本文件共有N行文本,每一行文本仅包含一个自然数,第一行为1、第二行为2,以此类推至N行为自然数N。假设对该文本文件执行一次“剪切和粘贴”操作含义如下:首先选定连续的若干行文本,“剪切”操作将选定的文本从文件中剪下(后面的内容将自动往前移动),而“粘贴”操作将剪切下来的文本插入到文件中的其他地方。上决╇ф想知道,在进行了连续若干次“剪切和粘贴”操作后,文本文件中前十行的内容,以验证这个编辑器的正确性。

Input

第一行一个整数T,表示测试组数。
每组的第一行包含两个用空格隔开的自然数N和K,N表示文件的总行数(10≤N≤100,000),K表示“剪切和粘贴”的总次数(1≤k≤100000)。
下面K行每一行包含一次“剪切和粘贴”操作的执行信息,每行包含三个用空格隔开自然数A,B和C,其中1≤A≤B≤N,0≤C≤N-(B-A+1)。A和B表示选定文本的第一行和最后一行,C表示被剪切下来的文本待插入处的前一行,如果C等于0则被剪切下来的的文本将被插入到文件的开头。

Output

对于每组测试,先输出一行"Case #X:"。X表示测试编号。
接下来10行,为所有的操作都完成后的文本文件中前十行所包含的数字。Sample Input
2
13 3
6 12 1
2 9 0
10 13 8
10 1
2 4 2Sample Output
Case #1:
6
7
8
9
10
11
12
2
3
4
Case #2:
1
5
2
3
4
6
7
8
9
10

Status Clarify

方法1:暴力Splay

方法2:从后往前推

代码写得搓,将就一下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define ll __int64
#define N 100010

int n,m;
int ansl;
int ans[N];
struct SplayTree
{
    int ch[N][2],pre[N],val[N],num[N],rev[N],sz[N];
    int top,root;

    inline void Rotate(int x,int c){
        int y=pre[x];
        ch[y][!c]=ch[x][c];
        if(ch[x][c]) pre[ch[x][c]]=y;
        pre[x]=pre[y];
        if(pre[y]) ch[pre[y]][ch[pre[y]][1]==y]=x;
        ch[x][c]=y;
        pre[y]=x;
        PushUp(y);
        if(y==root) root=x;
    }
    inline void Splay(int x,int f){
        while(pre[x]!=f)
        {
            if(pre[pre[x]]==f) Rotate(x,ch[pre[x]][0]==x);
            else
            {
                int y=pre[x],z=pre[y];
                int c=(ch[z][0]==y);
                if(ch[y][c]==x) Rotate(x,!c),Rotate(x,c);
                else Rotate(y,c),Rotate(x,c);
            }
        }
        PushUp(x);
        if(f==0) root=x;
    }
    inline void SplayKth(int k,int f){
        int x=root;
        k+=1;
        while(1)
        {
            if(k==sz[ch[x][0]]+1) break;
            else if(k<=sz[ch[x][0]]) x=ch[x][0];
            else k-=sz[ch[x][0]]+1,x=ch[x][1];
        }
        Splay(x,f);
    }
    inline void PushUp(int x){
        sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
    }
    inline void NewNode(int &x,int c,int f){
        x=++top;
        sz[x]=1;
        ch[x][0]=ch[x][1]=rev[x]=0;
        val[x]=c;
        pre[x]=f;
    }
    inline void Build(int &x,int l,int r,int f){
        if(l>r) return;
        int m=(l+r)>>1;
        NewNode(x,num[m],f);
        Build(ch[x][0],l,m-1,x);
        Build(ch[x][1],m+1,r,x);
        PushUp(x);
    }
    inline void Init(int n){
        top=pre[0]=ch[0][0]=ch[0][1]=sz[0]=rev[0]=0;
        val[0]=INF;
        for(int i=1;i<=n;i++) num[i]=i;
        Build(root,0,n+1,0);
    }
    void Res()
    {
        int l,r,tt;
        scanf("%d%d%d",&l,&r,&tt);
        int len=r-l+1;
        l--;
        SplayKth(l,0);
        SplayKth(r+1,root);
        int x=ch[ch[root][1]][0];
        ch[ch[root][1]][0]=0;
        PushUp(ch[root][1]);
        PushUp(root);
        tt++;
        SplayKth(tt-1,0);
        SplayKth(tt,root);
        ch[ch[root][1]][0]=x;
        pre[ch[ch[root][1]][0]]=ch[root][1];
        PushUp(ch[root][1]);
        PushUp(root);
    }
    void Print(int x){
        if(ch[x][0]) Print(ch[x][0]);
        if(val[x]>=1 && val[x]<=n)
            ans[++ansl]=val[x];
        if(ch[x][1])  Print(ch[x][1]);
    }
}t;
int main()
{
    int T,j,iCase=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        t.Init(n);
        printf("Case #%d:\n",iCase++);
        while(m--) t.Res();
        ansl=0;
        t.SplayKth(t.root,0);
        t.Print(t.root);
        for(int i=1;i<=10;i++) cout<<ans[i]<<endl;
    }
    return 0;
}

G: islands想吃糖果

Time Limit: 1000 MS Memory Limit: 65536 KB
Total Submit: 24 Accepted: 0 Page View: 80

Description

daidao买了很多糖果带到实验室,里面有n颗,islands看到了很高兴马上准备吃。daidao数了一下实验室的人有m个(包括daidao),问islands如果你能告诉我有多少种不同方案把这些糖果分给实验室的m个人,并且每人至少都要分一个,我就给你吃(对于2个方案,只要存在一个或一个以上的人分的数目不同就是2个不同的方案)。旁边的w703710691d说这可难不倒islands,再加上一个条件,要求每个人分的糖果的个数的最大公约数正好为k。(m个数的最大公约数是说有能整除这m个数中的最大的)。由于答案很大,daidao要求答案对1000000007取模。这下islands难住了,你能帮助islands吃到糖果吗。

Input

首先输入一个证书T表示测试数据组数(T<100)
接下来T行每行输入3个正整数,n,m,k。( 0 < n,m,k < = 200)

Output

对于每组数据输出按照格式“Case #x: a”(不包括冒号)输出一行。其中x表示第x组测试数据,a表示对应的答案。 Sample Input
3
1 1 1
4 2 2
5 3 1Sample Output
Case #1: 1
Case #2: 1
Case #3: 6

Status Clarify

后面再补,- -

H: islands学习几何

Time Limit: 1000 MS Memory Limit: 65536 KB
Total Submit: 4 Accepted: 0 Page View: 22

Description

由于实验室的几何大神都纷纷退役了,islands不得不担任起学习几何的重任。

有一天他遇到了这样一道题。如右图,有一个三角形ABC,圆F和线段AB相切,和CA,CB延长线相切。圆E和线段AC相切,和BA,BC延长线相切。圆D和线段BC相切,和AB,AC延长线相切。现在已知三角形ABC的三边长a,b,c。分别求三角形DEF的面积和图中阴影部分的总面积。

Input

首先输入测试组数T.(T<=10000)
接下来每组数据输入2个正整数a,b,c ( 0 < a,b,c <= 1000),表示三角形ABC的三边长吗,输入保证a,b,c能组成三角形。

Output

对于每组测试数据输出一行“Case #x: f1 f2”(不包括冒号),x表示第x组数据,f1表示该组数据三角形DEF的面积,f2表示阴影部分的面积(所有答案四舍五入到小数点后面2位)。Sample Input
2
3 4 5
10 11 12Sample Output
Case #1: 30.00 21.62
Case #2: 211.37 144.73

Status Clarify

后面再补,- -

I: 小红灌溉

Time Limit: 1000 MS Memory Limit: 65536 KB
Total Submit: 17 Accepted: 0 Page View: 104

Description

小红家有n行田地,每行田地由m块大小为1*1的小田地组成。这些田地构成了一个n*m的矩形。小红在某些小田地里种植了蔬菜。现在小红要给蔬菜灌溉。小红每次可以选择给某一行或某一列的田地灌溉。但是一块种植了蔬菜的田地只能被灌溉一次。由于种种原因,灌溉某行或某列的耗电量不同。所以小红想知道,灌溉完所有蔬菜的耗电量最少为多少?

Input

第一行输入一个数字T,表示输入数据组数。
接下来每组数据:
第一行输入两个数n,m(1<=n<=100,1<=m<=100)
接下来输入n行,每行m个数字。第i行的第j个数为0表示第i行的第j块田地为空地,如果为1,表示第i行的第j列种植有蔬菜。
接下来一行输入n个数字,第i个数字,表示灌溉第i行的耗电量。(每个数字大于0小于等于1000)
接下来一行输入m个数字,第i个数字,表示灌溉第i列的耗电量。(每个数字大于0小于等于1000)

Output

输出T行,第i行输出"Case #i: y",y为第i组数据的答案。Sample Input
1
2 2
1 0
0 1
1 2
2 1Sample Output
Case #1: 2

Status Clarify

行列建图,对每个连通块二染色取最小

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define N 510
#define M N*N/2

struct Edge
{
    int to,next;
}edge[M];
int head[N],tot;

int n,m;
int a[N][N];
int cost[N];
int color[N];
int t[2];

void init()
{
    tot=0;
    memset(head,-1,sizeof(head));
}
void add(int u,int v)
{
    edge[tot].to=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}
void dfs(int u,int c)
{
    color[u]=c;
    t[c]+=cost[u];
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].to;
        if(color[v]==-1)
            dfs(v,!c);
    }
}
int main()
{
    int T,iCase=1;
    scanf("%d",&T);
    while(T--){
        init();
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf("%d",&a[i][j]);
            }
        }
        for(int i=1;i<=n+m;i++) scanf("%d",&cost[i]);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(a[i][j]){
                    add(i,j+n);
                    add(j+n,i);
                }
            }
        }
        int ans=0;
        memset(color,-1,sizeof(color));
        for(int i=1;i<=n+m;i++){
            t[0]=t[1]=0;
            if(color[i]==-1) dfs(i,0);
            ans+=min(t[0],t[1]);
        }
        printf("Case #%d: %d\n",iCase++,ans);
    }
    return 0;
}

 J: islands的难题

Time Limit: 1000 MS Memory Limit: 65536 KB
Total Submit: 94 Accepted: 7 Page View: 90

Description

最近islands遇到一个难题,他想请人帮他解决。给一个数列a1,a2……an。有m个操作,每个操作是下面2种之一。

第1种操作是询问区间[l,r]上的值。

第2种操作是使得第k个数加上v。

Input

首先输入T表示测试数据组数(T<=5)
每组数据第一行输入n,m(n,m<=100000)表示n个数和m个操作。
接下来1行输入n个数,表示ai。(0<=a[i]<=100000)
接下来m行每行输入d(0或者1),l,r。
d=0表示第1操作 ( 0 < l <= r <= n),表示询问[l,r]上的答案。
d=1表示第2种操作( 0 < l <= n, 0 <= r <= 1000),表示a[l]加上r。

Output

对于每组测试数据首先输出一行“Case #x:”(不包括冒号)x表示第x组数据
对于m个操作,如果是1操作输出一行表示对应答案。Sample Input
1
5 5
1 2 3 4 5
0 1 5
0 3 4
1 5 1
0 1 5
0 3 4Sample Output
Case #1:
55
11
60
11

Status Clarify

简单线段树,维护区间和和区间权和(不知道咋说,见代码)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define N 100010

ll n,m;
ll a[N];
ll sum1[N<<2];
ll sum2[N<<2];

void pushup(ll rt)
{
    sum1[rt]=sum1[rt<<1]+sum1[rt<<1|1];
    sum2[rt]=sum2[rt<<1]+sum2[rt<<1|1];
}
void build(ll l,ll r,ll rt)
{
    if(l==r)
    {
        sum2[rt]=a[l];
        sum1[rt]=l*a[l];
        return;
    }
    ll m=(l+r)>>1;
    build(l,m,rt<<1);
    build(m+1,r,rt<<1|1);
    pushup(rt);
}
void update(ll l,ll r,ll rt,ll pos,ll c)
{
    if(l==r)
    {
        sum1[rt]+=pos*c;
        sum2[rt]+=c;
        return;
    }
    ll m=(l+r)>>1;
    if(pos<=m) update(l,m,rt<<1,pos,c);
    else update(m+1,r,rt<<1|1,pos,c);
    pushup(rt);
}
ll query(ll l,ll r,ll rt,ll L,ll R,ll op)
{
    if(l==L && R==r)
    {
        if(op==1) return sum1[rt];
        else return sum2[rt];
    }
    ll m=(l+r)>>1;
    if(R<=m) return query(l,m,rt<<1,L,R,op);
    else if(L>m) return query(m+1,r,rt<<1|1,L,R,op);
    else return query(l,m,rt<<1,L,m,op)+query(m+1,r,rt<<1|1,m+1,R,op);
}
int main()
{
    ll T,i,j,iCase=1;
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%lld%lld",&n,&m);
        for(i=1;i<=n;i++) scanf("%lld",&a[i]);
        build(1,n,1);
        printf("Case #%lld:\n",iCase++);
        while(m--)
        {
            ll op,a,b;
            scanf("%lld%lld%lld",&op,&a,&b);
            if(op==0)
                printf("%lld\n",query(1,n,1,a,b,1)-(a-1)*query(1,n,1,a,b,2));
            else
                update(1,n,1,a,b);
        }
    }
    return 0;
}
时间: 2024-10-08 20:26:48

信息学院第九届ACM程序设计竞赛题解的相关文章

2016河南省第九届ACM程序设计竞赛【正式赛真题】

A题:表达式求值 时间限制:1000 ms  |  内存限制:65535 KB 描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, X*Y 也是表达式; *优先级高于+.3. 如果 X 和 Y 是 表达式,则 函数 Smax(X,Y)也是表达式,其值为:先分别求出 X ,Y值的各位数字之和,再从中选最大数.4.如果 X 是 表达式,则 (X)也是表达式.例如:表达式 12*(2+3)+Smax(333,220+280) 的值为 6

山东省第一届acm程序设计竞赛题解

缺c 计算几何没看 f一个模拟,不想写,难度不大,J,因为时间挺早的,题目都比较简单,没什么难度,组队出个8题还是轻松的 A:水题 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e3+5; 4 string s[maxn]; 5 6 bool judge(string s1,string s2){ 7 if(s1.length()>s2.length())return 1; 8 int len=s1.

“师创杯”山东理工大学第九届ACM程序设计竞赛

A:签到题,直接LL做 B:模拟.没什么好写的 C:求k * m % n == 0最小的k,k = n / (gcd(n,m)) D:bfs E:把第一和第二棵树hash起来,然后在第一棵树每个节点找一下相等的 F:规律题 考虑len == 1的时候,年份范围是2009 - 2018len == 2的时候年份范围是2019 - 2118..然后递增,l[i] = r[i - 1] + 1,r[i] = l[i] + 10^i - 1.再随便特判一下就做完了 G:题意很迷,题意就是输入一篇文章,可

西南科技大学第十届ACM程序设计竞赛题解

A.德州扑克 B. 我恨11(1089) 问题描述 11是一个孤独的数字,小明十分讨厌这个数字,因此如果哪个数字中出现了11或者该数字是11的倍数,他同样讨厌这个数字.现在问题来了,在闭区间[L,R]之间有多少个小明讨厌的数字. 输入 多组测试数据,每组两个整数L,R(1<=L<=R<=100000) 输出 小明讨厌的数的个数. 样例输入 1 11 11 111 样例输出 1 11 签到题.直接暴力即可 #include <stdio.h> int find(int x) {

《ACM国际大学生程序设计竞赛题解Ⅰ》——基础编程题

这个专栏开始介绍一些<ACM国际大学生程序设计竞赛题解>上的竞赛题目,读者可以配合zju的在线测评系统提交代码(今天zoj貌似崩了). 其实看书名也能看出来这本书的思路,就是一本题解书,简单暴力的通过题目的堆叠来提升解决编程问题的能力. 那么下面开始探索吧. zoj1037: BackgroundFor years, computer scientists have been trying to find efficient solutions to different computing p

华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

华南师大 2017 年 ACM 程序设计竞赛新生初赛题解 华南师范大学第很多届 ACM 程序设计竞赛新生赛(初赛)在 2017 年 11 月 20 日 - 27 日成功举行,共有 146 名同学有效参赛(做出 1 题).进入决赛的资格初定为完成并通过 5 题或以上,决赛时间是 12 月 3 日,地点未定. 题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也

没有什么不可能—记山东省第六届ACM程序设计竞赛(退役总结帖)

大一下学期,第一次听说了ACM这个词,当时每周六也开设了培训课,但我好像一次也没有去过,当时对这个词并没有什么太大的印象.后来学院里引进了自己的OJ,那时候我连基本的输入输出格式都不懂,当经历了一堆的WA,TLE之后突然换来的一个AC竟带来了莫名的喜悦.后来学院举办了第一届ACM程序设计竞赛,我报名参加了新秀赛和团队赛.三个小时的新秀赛,当时貌似做出了三道,意外的拿到了一等奖,这也成为了我大学生活的一个重要转折点.四个小时的团队赛,做得很艰难,各种不会,最后只做出了一道,排在三等奖的末尾.比赛之

开锁魔法II 哈尔滨理工大学第五届ACM程序设计竞赛

规律:a[i][j]=     1/i * a[i-1][j-1]      +      (i-1)/i * a[i-1][j];  (少一个盒子时使用j-1 次魔法的概率)   (少一个盒子时使用j次魔法的概率) 公式推导如下: 设a[i][j]为打开i个盒子正好需要j次魔法的情况. ① 1->1 ② 1->1 , 2->2;        两次 1->2 , 2->1;        一次 ③ 1->1 , 2->2 , 3->3;     三次 1-

电信学院第一届新生程序设计竞赛题解及std

首先非常感谢各位同学的参加,还有出题验题同学的辛勤付出 昨天想偷懒就是不想再把我C++11的想法改没了,大家看不懂的可以百度一下哦,懒得再写gcc了,毕竟代码是通的 题目类型一览 A Kannyi的数字密码 (模拟&&复杂的循环||手算)B Kannyi爱干净(注意变量初始化||set)C Kannyi的正方体和圆柱体(输入输出签到,PI已提示)D kannyi的独木桥(max和min)E Kannyi的简单检查 (循环签到 注意'-')F Kannyi的倒计时(a+b签到)G kanny