1. 程式人生 > 其它 >Linux學習第二週

Linux學習第二週

3s 512M

【題目表述】

某天醒來,koishi發現自己變成了一支彩筆。並且他站在一排彩筆之中。

一開始每支彩筆的彩筆程度都為1。如果有兩支彩筆顏色相同,那麼他們就能合二為一,並且彩筆程度相加。

現在koishi想知道,從第l支彩筆到第r支彩筆,最多能有多大的彩筆程度。

【輸入格式】

第一行為彩筆數量n和詢問次數q
第二行為n個這個整數,每個整數代表這個彩筆的顏色
接下來q行,每行兩個整數l和r

【輸出格式】
共q行,每行一個整數,表示最大的彩筆程度

【樣例輸入】
6 2
1 3 2 3 3 2
1 6
2 4

【樣例輸出】
3
2

【資料範圍與提示】
1<=n,q<=3
*1e5 1<=彩筆顏色<=n 1<=l<=r<=n 對於樣例的第一個詢問,顏色為1的彩筆程度為1,顏色為2的彩筆程度為2,3的彩筆程度為3,因此彩筆程度最大為3。 對於第二個詢問,顏色為2的彩筆程度為1,顏色為3的彩筆程度為2,因此彩筆程度最大為2。
View problem
#include <bits/stdc++.h>
using namespace std;
#define ri register int 
#define M 1005

template <class G>void read(G &x)
{
    x
=0;int f=0;char ch=getchar(); while(ch<'0'||ch>'9'){f|=(ch=='-');ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} x=f?-x:x; return ; } int a[M]; int b[M]; int f[M][M]; int n,m; int main(){ freopen("D:\\學習\\C++\\swjtu比賽\\2021校賽決賽文件\\極致美學\\data\\20.in
","r",stdin); read(n);read(m); for(ri i=1;i<=n;i++) read(a[i]); for(ri i=1;i<=m;i++) read(b[i]); for(ri i=1;i<=max(n,m);i++) f[0][i]=f[i][0]=i; for(ri i=1;i<=n;i++) { for(ri j=1;j<=m;j++) { if(a[i]==b[j]) f[i][j]=f[i-1][j-1]; else { f[i][j]=min(f[i][j-1],f[i-1][j])+1; } f[i][j]=min(f[i][j],f[i-1][j-1]+1); } } cout<<f[n][m]; return 0; }
View Code

好難啊。