1. 程式人生 > >2018.03.04 下午測試

2018.03.04 下午測試

day alt 表操作 輸入格式 puts 樹形 ack 至少 沒有

循環移動

(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 下午測試