NOIP练习赛题目5

小象涂色
难度级别:C; 运行时间限制:1000ms; 运行空间限制:262144KB; 代码长度限制:2000000B

试题描述

小象喜欢为箱子涂色。小象现在有c种颜色,编号为0~c-1;还有n个箱子,编号为1~n,最开始每个箱子的颜色为1。小象涂色时喜欢遵循灵感:它将箱子按编号排成一排,每次涂色时,它随机选择[L,R]这个区间里的一些箱子(不选看做选0个),为之涂上随机一种颜色。若一个颜色为a的箱子被涂上b色,那么这个箱子的颜色会变成(a*b)modc。请问在k次涂色后,所有箱子颜色的编号和期望为多少?


输入

第一行为T,表示有T组测试数据。
对于每组数据,第一行为三个整数n,c,k。
接下来k行,每行两个整数Li,Ri,表示第i个操作的L和R。

输出

对于每组测试数据,输出所有箱子颜色编号和的期望值,结果保留9位小数。

输入示例

3
3 2 2
2 2
1 3
1 3 1
1 1
5 2 2
3 4
2 4

输出示例

2.062500000
1.000000000
3.875000000

其他说明

数据范围:
40%的数据1 <= T <= 5,1 <= n, k <= 15,2 <= c <= 20
100%的数据满足1 <= T <= 10,1 <= n, k <= 50,2 <= c <= 100,1 <= Li <= Ri <= n

首先,操作顺序是没有影响的,那么我们可以记录每个位置进行了多少次操作。

就可以写个DP,得出每个位置进行若干次操作后的期望颜色。

#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
inline int read() {
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
    return x*f;
}
double f[55][105];
int n,c,k,cnt[55];
int main() {
    dwn(T,read(),1) {
        n=read();c=read();k=read();
        memset(f,0,sizeof(f));
        memset(cnt,0,sizeof(cnt));
        f[0][1]=1;
        rep(t,0,k-1) rep(j,0,c-1) {
            f[t+1][j]+=f[t][j]*0.5;
            rep(k,0,c-1) f[t+1][(j*k)%c]+=f[t][j]*(0.5/c);
        }
        double ans=0;
        rep(i,1,k) {
           int l=read(),r=read();
           rep(j,l,r) cnt[j]++;
        }
        rep(i,1,n) rep(j,0,c-1) ans+=f[cnt[i]][j]*j;
        printf("%.9lf\n",ans);
    }
    return 0;
}

行动!行动!
难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B

试题描述

大CX国的大兵Jack接到一项任务:敌方占领了n座城市(编号0~n-1),有些城市之间有双向道路相连。Jack需要空降在一个城市S,并徒步沿那些道路移动到T城市。虽然Jack每从一个城市到另一个城市都会受伤流血,但大CX国毕竟有着“过硬”的军事实力,它不仅已经算出Jack在每条道路上会损失的血量,还给Jack提供了k个“简易急救包”,一个包可以让Jack在一条路上的流血量为0。Jack想知道自己最少会流多少血,不过他毕竟是无脑的大兵,需要你的帮助。

输入

第一行有三个整数n,m,k,分别表示城市数,道路数和急救包个数。
第二行有两个整数,S,T。分别表示Jack空降到的城市编号和最终要到的城市。
接下来有m行,每行三个整数a,b,c,表示城市a与城市b之间有一条双向道路。

输出

Jack最少要流的血量。

输入示例

5 6 1
0 3
3 4 5
0 1 5
0 2 100
1 2 5
2 4 5
2 4 3

输出示例

8

其他说明

数据范围:
对于30%的数据,2<=n<=50,1<=m<=300,k=0;
对于50%的数据,2<=n<=600,1<=m<=6000,0<=k<=1;
对于100%的数据,2<=n<=10000,1<=m<=50000,0<=k<=10.

拆点最短路。。。

#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
inline int read() {
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
    return x*f;
}
const int maxn=10010;
const int maxm=200010;
struct HeapNode {
    int u,d;
    bool operator < (const HeapNode& ths) const {return d>ths.d;}
};
int n,m,k,s,t,first[maxn],next[maxm];
int to[maxm],dis[maxm],d[15][maxn],done[maxn*12];
priority_queue<HeapNode> Q;
void spfa() {
    rep(i,0,k) rep(j,0,n-1) d[i][j]=1<<30;
    Q.push((HeapNode){s+n*k,0});d[k][s]=0;
    while(!Q.empty()) {
        if(done[Q.top().u]) {Q.pop();continue;}
        else done[Q.top().u]=1;
        int x=Q.top().u%n,k2=Q.top().u/n;Q.pop();
        ren {
            if(d[k2][to[i]]>d[k2][x]+dis[i]) {
                d[k2][to[i]]=d[k2][x]+dis[i];
                Q.push((HeapNode){to[i]+n*k2,d[k2][to[i]]});
            }
            if(d[k2-1][to[i]]>d[k2][x]) {
                d[k2-1][to[i]]=d[k2][x];
                Q.push((HeapNode){to[i]+n*k2-n,d[k2-1][to[i]]});
            }
        }
    }
}
int main() {
    n=read();m=read();k=read();
    s=read();t=read();
    rep(i,1,m) {
        int x=read();to[i]=read();to[i+m]=x;dis[i+m]=dis[i]=read();
        next[i]=first[x];first[x]=i;next[i+m]=first[to[i]];first[to[i]]=i+m;
    }
    spfa();
    int ans=1<<30;
    rep(i,0,k) ans=min(ans,d[i][t]);
    printf("%d\n",ans);
    return 0;
}

Hzwer的陨石
难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B

试题描述

经过不懈的努力,Hzwer召唤了很多陨石。已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域。有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域的陨石全搬到了另外一些区域。

在ndsf愉快的搬运过程中,Hzwer想知道一些陨石的信息。对于Hzwer询问的每个陨石i,你必须告诉他,在当前这个时候,i号陨石在所在区域x、x区域共有的陨石数y、以及i号陨石被搬运的次数z。


输入

输入的第一行是一个正整数T。表示有多少组输入数据。
接下来共有T组数据,对于每组数据,第一行包含两个整数:N和Q。
接下来Q行,每行表示一次搬运或一次询问,格式如下:
T A B:表示搬运,即将所有在A号球所在地区的陨石都搬到B号球所在地区去。
Q A:悟空想知道A号陨石的x,y,z

输出

对于第i组数据,第一行输出“Case i:”接下来输出每一个询问操作的x,y,z,每一个询问操作的答案占一行。每组数据之间没有空行。

输入示例

2
3 3
T 1 2
T 3 2
Q 2
3 4
T 1 2
Q 1
T 1 3
Q 1

输出示例

Case 1:
2 3 0
Case 2:
2 2 1
3 3 2

其他说明

数据范围:
20%的数据保证:0≤T≤20,2<N<=100,2<Q<=100。
100%的数据保证:0≤T≤100,2<N<=10000,2<Q<=10000。
对于所有数据保证搬运操作中AB在N的范围内且所在区域不相同。:

前两问很好做,写个并查集就行了。第三问可以这么做:如果x区域的陨石全部搬到y区域,那么将x->y的值+1,则x地区的陨石被搬运的次数就是x到根节点的距离,并查集记录一下信息就行了。

#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
    return x*f;
}
const int maxn=10010;
int pa[maxn],s[maxn],d[maxn];
int findset(int x) {
    if(pa[x]==x) return x;
    int res=findset(pa[x]);d[x]+=d[pa[x]];
    return pa[x]=res;
}
int main() {
    int T=read();
    rep(Case,1,T) {
        printf("Case %d:\n",Case);
        int n=read(),m=read();
        rep(i,1,n) pa[i]=i,s[i]=1,d[i]=0;
        rep(i,1,m) {
            char cmd[12];scanf("%s",cmd);
            if(cmd[0]==‘Q‘) {
                int y,x=findset(y=read());
                printf("%d %d %d\n",x,s[x],d[y]);
            }
            else {
                int x=findset(read()),y=findset(read());
                pa[x]=y;s[y]+=s[x];d[x]++;
            }
        }
    }
    return 0;
}

挖掘机
难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B

试题描述

今天,丧尸czy开着挖掘机去上学(……)。但是他发现他的mz满天下,所以一路上他碰到了好多他的mz。一开始他以1km/min的速度(=60km/h……)开着挖掘机前进。他发现他只会在恰好到达某一时刻或者到达某个距离遇到mz。每次遇到mz,czy都会毫不犹豫的把她们顺路捎走(^_^)。但是他实在是太虚了,以至于当有i个mz时他的速度下降到1/(i+1)。具体说,一开始czy以1km/min速度前进,有1个mz的时候速度变为1/2 km/min,有2个时变为1/3 km/min……以此类推。现在问题来了,给出每个mz在何时出现,请你算出czy到学校要多久。

输入

输入第一行2个数n,m,分别表示mz数和czy与学校的距离(km)
接下来2到n+1行由字符串与数字构成
Dist  x表示在距离达到x km时出现一个mz
Time  x表示在时间达到x min时出现一个mz

输出

输出一个整数,表示到达学校的时间。如果不能整除,直接输出整数部分即可。

输入示例

2 20
Time 3
Dist 10

输出示例

47

其他说明

数据范围
对于30%数据,n,m<=50
对于50%数据,n,m<=2000
对于100%数据,n,m<=200000,x<=10^9,保证输入的数字都是整数

奇怪的题目,排序乱搞。。。

#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
    return x*f;
}
typedef long long ll;
const int maxn=200010;
int A[maxn],B[maxn],n1,n2;
char s[20];
int main() {
    int n=read(),m=read();
    rep(i,1,n) {
        scanf("%s",s);
        if(s[0]==‘T‘) A[++n1]=read();
        else B[++n2]=read();
    }
    B[++n2]=m;
    sort(A+1,A+n1+1);sort(B+1,B+n2+1);
    double ans=0,p=0.0;int c=1,cur=1;
    rep(i,1,n2) {
        while(cur<=n1&&ans+c*(B[i]-p)>A[cur]) {
            p+=(A[cur]-ans)/c;ans=A[cur];c++;cur++;
        }
        ans+=c*(B[i]-p);p=B[i];c++;
    }
    printf("%lld\n",(ll)ans);
    return 0;
}

藏宝图
难度级别:C; 运行时间限制:4000ms; 运行空间限制:262144KB; 代码长度限制:2000000B

试题描述

Czy发现了一张奇怪的藏宝图。图上有n个点,m条无向边。已经标出了图中两两之间距离dist。但是czy知道,只有当图刚好又是一颗树的时候,这张藏宝图才是真的。如果藏宝图是真的,那么经过点x的边的边权平均数最大的那个x是藏着宝物的地方。请计算这是不是真的藏宝图,如果是真的藏宝之处在哪里。

输入

输入数据第一行一个数T,表示T组数据。
对于每组数据,第一行一个n,表示藏宝图上的点的个数。
接下来n行,每行n个数,表示两两节点之间的距离。

输出

输出一行或两行。第一行”Yes”或”No”,表示这是不是真的藏宝图。
若是真的藏宝图,第二行再输出一个数,表示哪个点是藏宝之处。

输入示例

2
3
0 7 9
7 0 2
9 2 0
3
0 2 7
2 0 9
7 9 0

输出示例

Yes
1
Yes
3
样例解释:第一棵树的形状是1--2--3。1、2之间的边权是7,2、3之间是2。
 第二棵树的形状是2--1--3。2、1之间的边权是2,1、3之间是7。

其他说明

数据范围
对于30%数据,n<=50,1<=树上的边的长度<=10^9。
对于50%数据,n<=600.
对于100%数据,1<=n<=2500
0<=dist[i][j]<=10^12,T<=5

如果一个图是树,则整个图的最小生成树为这个图。

可以计算出原图的最小生成树,重建整个图,再重判是否有矛盾即可。

#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
typedef long long ll;
inline ll read() {
    ll x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
    return x*f;
}
const int maxn=2510;
struct Edge {
    int u,v;ll w;
    bool operator < (const Edge& ths) const {return w<ths.w;}
}E[maxn*maxn/2];
ll d[maxn][maxn];
int n,pa[maxn],first[maxn],next[maxn<<1],to[maxn<<1],dis[maxn<<1],e;
int findset(int x) {return x==pa[x]?x:pa[x]=findset(pa[x]);}
void AddEdge(int u,int v,int w) {
    to[++e]=v;dis[e]=w;next[e]=first[u];first[u]=e;
    to[++e]=u;dis[e]=w;next[e]=first[v];first[v]=e;
}
int vis[maxn];
ll dist[maxn];
queue<int> Q;
void bfs(int x) {
    memset(vis,0,sizeof(vis));
    Q.push(x);vis[x]=1;dist[x]=0;
    while(!Q.empty()) {
        x=Q.front();Q.pop();
        ren if(!vis[to[i]]) {
            vis[to[i]]=1;
            dist[to[i]]=dist[x]+dis[i];
            Q.push(to[i]);
        }
    }
}
int main() {
    dwn(T,read(),1) {
        n=read();int m=0;e=0;memset(first,0,sizeof(first));
        rep(i,1,n) rep(j,1,n) d[i][j]=read();
        rep(i,1,n) {
            pa[i]=i;int best=0;
            rep(j,1,n) if(i<j) E[++m]=(Edge){i,j,d[i][j]};
        }
        sort(E+1,E+m+1);
        rep(i,1,m) {
            int x=findset(E[i].u),y=findset(E[i].v);
            if(x!=y) pa[x]=y,AddEdge(E[i].u,E[i].v,E[i].w);
        }
        int ok=1;
        rep(i,1,n) {
            bfs(i);
            rep(j,1,n) if(d[i][j]!=dist[j]) ok=0;
        }
        if(!ok) puts("No");
        else {
            puts("Yes");
            if(n==1) puts("1");
            else {
                int ans=0;double mx=0.0;
                rep(x,1,n) {
                    int cnt=0;double val=0;
                    ren cnt++,val+=dis[i];
                    val/=cnt;if(val>mx) mx=val,ans=x;
                }
                printf("%d\n",ans);
            }
        }
    }
    return 0;
}

最大公约数
难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B

试题描述

话说CD比较欠扁,他表示在课室的日子没有教主在旁边打他的日子太寂寞了,所以这一晚,他终于来到了电脑室被打。由于CD是大家的宠物,于是大家都来打CD了。电脑室里有n个人,第i个人希望打CD ai下。但是太多人打CD,他又会不爽,于是他规定只能有K个人打到他,并且为了公平起见,最终K个人打他的次数都必须是相同的,CD规定这个次数就是这K个人希望打他的次数的最大公约数。为什么是最大公约数呢?因为他觉得被打的次数是GCD的话他才会变成Glad CD。之前说了,CD比较欠扁,于是CD希望,K个人打他的次数的和最大。你能告诉他他最后总共会被打多少下么?


输入

第一行两个正整数n,k。
第二行n个正整数,表示每个人希望打CD多少下。

输出

输出一个正整数表示CD会被打多少下

输入示例

3 1
1 2 3

输出示例

3

其他说明

数据说明
对于30%的数据,保证k≤n≤20。
对于50%的数据,保证输入中所有数小于5000。
对于100%的数据,保证输入中所有数小于500000,k≤n。

枚举答案ans,数一数有多少数是ans的倍数。根据调和数列定理,时间复杂度为O(nlogn)

#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
    return x*f;
}
const int maxn=500010;
int S[maxn],ans;
int main() {
    int n=read(),k=read();
    rep(i,1,n) S[read()]++;
    rep(i,1,500000) {
        int cnt=0;
        for(int j=i;j<=500000;j+=i) cnt+=S[j];
        if(cnt>=k) ans=max(ans,i);
    }
    printf("%lld\n",(long long)ans*k);
    return 0;
}

密码
难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B

试题描述

哪里有压迫,哪里就有反抗。

moreD的宠物在法庭的帮助下终于反抗了。作为一只聪明的宠物,他打算把魔法使moreD的魔法书盗去,夺取moreD的魔法能力。但moreD怎么会让自己的魔法书轻易地被盗取?moreD在魔法书上设置了一个密码锁,密码锁上有一个问题。

施以斯卧铺魔法吧,你有M次机会,如此将得完美密码。

然后是一串小写字母串。

moreD的宠物斯卧铺魔法就是施法时的字符串其中相邻两位交换。

而moreD对于完美密码的定义自然是最小字典序了。

请帮助moreD的宠物,想出密码吧。


输入

第一行一个整数M,表示操作次数。
第二行一串小写字母组成的字符串S,如题目所示。

输出

输出完美密码

输入示例

3
dcba

输出示例

adcb

其他说明

【数据范围】
对于30%的数据|S|≤10 
对于60%的数据|S|≤3,000
对于100%的数据8≤|S|≤100,000 M≤(|S|-8)^2+2
【后记】
宠物最终战胜了moreD,和自己的宠物快乐地生活着。
【样例解释】
先对第3,4两位施法,字符串变成dcab,然后对第2,3两位施法,字符串变成dacb,最后对第1,2两位施法,字符串变成adcb。
时间: 2024-11-15 01:17:59

NOIP练习赛题目5的相关文章

NOIP练习赛题目3

魔兽争霸 难度级别:C: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 小x正在销魂地玩魔兽他正控制着死亡骑士和n个食尸鬼(编号1-n)去打猎死亡骑士有个魔法,叫做“死亡缠绕”,可以给食尸鬼补充HP战斗过程中敌人会对食尸鬼实施攻击,食尸鬼的HP会减少,小x希望随时知道自己部队的情况,即HP值第k多的食尸鬼有多少HP,以便决定如何施放魔法.请同学们帮助他:)小x向你发出3种信号:(下划线在输入数据中表现为空格)A_i_a表示敌军向第i个食

[题解+总结]NOIP历年题目分析

1.前言 迎接NOIP的到来...在这段闲暇时间,决定刷刷水题.这里只是作非常简单的一些总结. 2.NOIP2014 <1> 生活大爆炸之石头剪刀布(模拟) 这是一道考你会不会编程的题目...方法有很多,预处理输赢矩阵,或者一大堆if什么的乱搞就行了. <2> 联合权值(搜索) 简单的树上求解问题,由于只需要长度为2的链,只要能够清楚地分析出各种情况,一遍DFS直接出来:自身节点与祖父节点有一对:自身节点与兄弟节点有若干对.在计算权值的时候存在一个优化,即如果每次得到一对之后就计算

noip部分题目总结

6102 天天爱跑步 毒瘤题,神仙树上上差分. 先推出两个式子 \(dep[u] = dep[i] + w[i]\), \(dep[u] - dep[lca] = w[i] - dep[i]\) 开桶差分. 因为差分会导致统计子树时会有子树外的值,所以要用前缀作差的形式来消除影响. #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<que

ACM-ICPC国际大学生程序设计竞赛北京赛区(2015)网络练习赛 题目4 : Beautiful String

We say a string is beautiful if it has the equal amount of 3 or more continuous letters (in increasing order.) Here are some example of valid beautiful strings: "abc", "cde", "aabbcc", "aaabbbccc". Here are some exa

[CODEVS 1043] Noip 2000 方格取数

1043 方格取数 时间限制: 1s  空间限制: 128000 KB 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样例): 某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点.在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0). 此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大. 输入描述 Input Description 输入的

【NOIP2015】子串

题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问有多少种方案可以使得这个新串与字符串 B 相等?注意:子串取出 的位置不同也认为是不同的方案. 输入输出格式 输入格式: 输入文件名为 substring.in. 第一行是三个正整数 n,m,k,分别表示字符串 A 的长度,字符串 B 的长度,以及问 题描述中所提到的 k,每两个整数之间用一个空格隔

08day1

高中运动会 最大公约数 [问题描述] 梦幻城市每年为全市高中生兴办一次运动会.为促使各校同学之间的交流,采用特别的分队方式:每一个学校的同学,必须被均匀分散到各队,使得每一队中该校的人数皆相同.为增加比赛的竞争性,希望分成越多队越好.你的任务是由各校的人数决定最多可以分成的队数. [输入] 第一行一个正整数 n ,代表学校的个数. 接下来 n 行,每行一个正整数,分别代表这 n 个学校的人数. [输出] 最多可分成的队数. [数据规模] 对于 100%的数据,n≤500,每个学校人数最多 100

Noip2007提高组总结

两道基础题,后两题比较麻烦,算法想出来后,还是一些细枝末节的问题,需要特别注意,感觉Noip的题目质量还是挺高的,每做一套,都感觉会有大大小小不同的收获,就要月考了,最后把07年的题目总结一下,算是这两天的收获-- T1:统计数字 没有任何悬念的练习题,排序然后输出-- + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <cstdio> #include <algorithm> int n,a[200005],pos; using n

【基础练习】【区间DP】codevs1090 加分二叉树题解

2003 NOIP TG 题目描写叙述 Description 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),当中数字1,2,3,-,n为节点编号.每一个节点都有一个分数(均为正整数),记第j个节点的分数为di,tree及它的每一个子树都有一个加分,任一棵子树subtree(也包括tree本身)的加分计算方法例如以下: subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数 若某个子树为主,规定其加分为1,叶子的加分就是叶节点本身的分数. 不考