2018.03.04 下午測試
循環移動
(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","View Coder",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; }
閱讀計劃
(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 下午測試