码迷,mamicode.com
首页 > 其他好文 > 详细

2018.03.04 下午测试

时间:2018-03-04 20:04:05      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:cli   约束   一个   sed   cpp   就是   节点   阅读   格式   

循环移动

(cyclic.cpp/c/pas)

(1s/256M)

问题描述

给出一个字符串S与N个操作。每个操作用三元组(L, R, K)进行描述:操作将字符串第L个到第R个位置构成的子串循环移动K次。一次循环移动就是将字符串最后的这个字符移动到第一位,其余的字符顺次后移。

例如,对于字符串abacaba,操作(L=3, R=6, K=1)后得到的字符串即为abbacaa。

求出在N个操作后得到的字符串。

 

输入格式(cyclic.in)

第一行一个字符串S。

第二行一个整数N,代表操作的总数。

接下来N行每行三个数L,R,K,每行代表一个操作。

 

输出格式(cyclic.out)

一行一个字符串,代表N个操作后的字符串。

 

样例输入

abbacaa

2

3 6 1

1 4 2

 

样例输出

ababaca

 

数据范围与约束

设|S|为字符串S的长度。

对于30%的数据,|S|<=100, N<=100, K<=100

对于100%的数据,|S|<=10000, N<=300, K<=1000,000,1<=L<=R<=|S|

技术分享图片
#include<cstdio>
#include<cstring>
using namespace std;
int n,ll;
char a[100050],b[100050];
int main()
{
    freopen("cyclic.in","r",stdin);
    freopen("cyclic.out","w",stdout);
    gets(a);
    ll=strlen(a);
    scanf("%d",&n); 
    for(int i=0;i<ll;i++) b[i]=a[i];
    for(int i=1;i<=n;i++){
        int l,r,k;
        scanf("%d%d%d",&l,&r,&k);
        --l;--r;k%=(r-l+1);
        for(int j=l;j<=r;j++){
            int tp=j+k;
            if(tp>r) tp=tp-r+l-1;
            a[tp]=b[j];
        }
        for(int j=l;j<=r;j++) b[j]=a[j];
    }
    puts(a);
    fclose(stdin);fclose(stdout);
    return 0;
}
View Code

 

阅读计划

(book.cpp/c/pas)

(1s/256M)

问题描述

暑假到了,Rick制定了一个长达M天的阅读计划。他一共有N本书,从1至N进行标号;Rick将它们从上至下摞成一堆。他每天都会读一本书,假设他要读编号为X的书,他会按照以下步骤:

1. 将这本书上方的所有书搬起来

2. 将这本书拿出来

3. 将搬起来的书摞回去

4. 看完后把这本书放到顶端

 

每本书都会有各自的重量,Rick不希望搬起太过重的书。于是他希望能重新安排这N本书的顺序,使得读完M本书之后,搬书的重量之和最小。

 

输入格式(book.in)

第一行两个整数N与M,分别代表书的数量和阅读的天数。

第二行N个整数,代表每本书的重量。

第三行M个整数,代表每天要读的书的编号。

 

输出格式(book.out)

一行一个整数,代表最小的重量之和。

 

样例输入

3 5

1 2 3

1 3 2 3 1

 

样例输出

12

 

数据范围与约束

对于30%的数据,N<=10.

对于100%的数据,2<=N<=500, 1<=M<=1000, 每本书重量不超过100.

00%的数据,|S|<=10000, N<=300, K<=1000,000,1<=L<=R<=|S|

 

按照阅读顺序贪(想到了没有?没想到)

技术分享图片
#include<cstdio>

using namespace std;
int m,n,w[550],day[1050],sx[550],ans,vis[505],tot;
struct node{
    int sum,z,x;
}tp[550];
int main()
{
    freopen("book.in","r",stdin);
    freopen("book.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&w[i]);
    for(int i=1;i<=m;i++){
        scanf("%d",&day[i]);
        if(vis[day[i]]==0)
            sx[++tot]=day[i];
        vis[day[i]]=1;
    }
    for(int i=1;i<=n;i++){
        if(vis[i]==0){
            sx[++tot]=i;
        } 
    }
    for(int i=1;i<=m;i++){
        int k,ttp;
        for(int j=1;j<=n;j++){
            if(day[i]==sx[j]){
                k=j;ttp=sx[j];
                break;
            }ans+=w[sx[j]];
        }
        for(int i=k;i>1;i--) sx[i]=sx[i-1];
        sx[1]=ttp;
    }
    printf("%d",ans);
    fclose(stdin);fclose(stdout);
    return 0;
}
View Code

树集

(set.cpp/c/pas)

(1s/256M)

问题描述

给出一棵N个节点的树,每个节点上都附有一个权值ai。现在Ann想从中选出若干个节点,满足以下条件:

 

1. 至少选出一个节点

2. 节点之间是连通的

3. 设节点中权值最大的为ap,最小的为aq,则需要满足ap-aq不大于某个定值D。

 

Ann想知道有多少种选择的方式?结果对1,000,000,007取模即可。

 

输入格式(set.in)

第一行包含两个整数D, N,分别代表定值D与节点总数N。

第二行包含N个整数ai,分别代表每个点的权值。

接下来N-1行,每行包含两个数u, v,代表树中节点u与节点v是相连的。

 

输出格式(set.out)

一个整数,代表方案数模1,000,000,007的结果。

 

样例输入

1 4

2 1 3 2

1 2

1 3

3 4

 

样例输出

8

 

样例解释

8个选择方式为:{1},?{2},?{3},?{4},?{1,?2},?{1,?3},?{3,?4}, {1,?3,?4}。

 

数据范围与约束

对于30% 的数据,1<=n<=10;

对于另外的30% 的数据,d=2000.

对于100% 的数据,0<=d<=2000, 1<=n<=2000, 1<=ai<=2000.

未完成的题:树形DP

2018.03.04 下午测试

标签:cli   约束   一个   sed   cpp   就是   节点   阅读   格式   

原文地址:https://www.cnblogs.com/song-/p/8505558.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!