vue props 多型別_一個TypeScript簡例,以及Vue支援TS的一些些事兒
B - 補提交卡
蒜頭君給自己定了一個巨集偉的目標:連續
100
天每天堅持在計蒜客題庫提交一個程式。
100
天過去了,蒜頭君檢視自己的提交記錄發現有
N
天因為貪玩忘記提交了。於是蒜頭君軟磨硬泡、強忍著花椰菜鄙視的眼神從花椰菜那裡要來
M
張 “補提交卡”。每張 “補提交卡” 都可以補回一天的提交,將原本沒有提交程式的一天變成有提交程式的一天。蒜頭君想知道通過利用這
M
張補提交卡,可以使自己的 “最長連續提交天數” 最多變成多少天。
輸入格式
輸出格式
對於每組資料,輸出通過使用補提交卡蒜頭君的最長連續提交天數最多變成多少。
Sample Input
3
5 1
34 77 82 83 84
5 2
5 10
10 30 55 56 90
Sample Output
76
59
100
思路 就是找差n 資料間的差值
關鍵在於考慮第一個資料和最後一個數據 所以加a[0]=0;
a[n+1]=101;很關鍵
#include<stdio.h>
int a[1010];
int main()
{
int n,m,x;
int i,j;
int cnt,max;
scanf("%d",&x);
while(x--)
{
scanf("%d %d",&n,&m);
for(i=1;i<=n; i++)
scanf("%d",&a[i]);
if(m>=n)
{
printf("100\n");
continue;
}
max=0;
a[0]=0;
a[n+1]=101;
for(i=1;i<=n-m+1;i++)
{
cnt=a[i+m]-a[i-1]-1;
//printf("cnt=%d\n",cnt);
if(cnt>max)
max=cnt;
}
printf("%d\n",max);
}
}
E - 數列極差
佳佳的老師在黑板上寫了一個由 n 個正整陣列成的數列,要求佳佳進行如下操作:每次擦去其中的兩個數 a 和 b,然後在數列中加入一個數 a×b+1,如此下去直至黑板上剩下一個數為止,在所有按這種操作方式最後得到的數中,最大的為 max,最小的為 min, 則該數列的極差定義為 M=max−min。
由於佳佳忙於準備期末考試,現請你幫助他,對於給定的數列,計算出相應的極差 M。
輸入格式
第一行為一個正整數 n 表示正整數序列的長度;
在接下來的 n 行中,每行輸入一個正整數。
接下來的一行有一個 0,表示資料結束。
輸出格式
輸出只有一行,為相應的極差 d。
樣例
Input Output
3
1
2
3
0
2
資料範圍與提示
對於全部資料,0≤n≤50000,保證所有資料計算均在 32 位有符號整數範圍內
貪心思想:每次選最小的運算 注意新算出來的資料需要與剩下的資料重新排序選擇最小的
#include<stdio.h>
void quick_sort1(int left,int right,int a[])
{
int i,j,temp,t;
if(left>right)
return;
temp=a[left];
i=left;
j=right;
while(i!=j)
{
while(a[j]>=temp&&i<j)
j--;
while(a[i]<=temp&&i<j)
i++;
//沒相遇時交換
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];
a[i]=temp;
quick_sort1(left,i-1,a);
quick_sort1(i+1,right,a);
return;
}
void quick_sort2(int left,int right,int a[])
{
int i,j,temp,t;
if(left>right)
return;
temp=a[left];
i=left;
j=right;
while(i!=j)
{
while(a[j]<=temp&&i<j)
j--;
while(a[i]>=temp&&i<j)
i++;
//沒相遇時交換
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];
a[i]=temp;
quick_sort2(left,i-1,a);
quick_sort2(i+1,right,a);
return;
}
int main()
{
int a[1010],b[1010],n;
int x,i,cnt=0,ans,sum1,sum2;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
//quick_sort(0,cnt-1);
for(i=0;i<=n;i++)
{
b[i]=a[i];
}
quick_sort2(0,n-1,b);
quick_sort1(0,n-1,a);
/*for(i=0;i<n;i++)
{
printf("%d ",b[i]);
}*/
//for(i=0;i<cnt;i++)
//printf("%d ",a[i]);
for(i=0;i<=n-2;i++)
{
a[i+1]=a[i]*a[i+1]+1;
b[i+1]=b[i]*b[i+1]+1;
quick_sort1(i+1,n-1,a);
quick_sort2(i+1,n-1,b);
}
//printf("%d %d",a[n-1],b[n-1]);
printf("%d",a[n-1]-b[n-1]);
}
過河
UCAS_ACM小組的N名成員外出旅遊,結果在路上碰到了一條河,岸邊只有一艘船,這艘船最多隻能載兩人。
已知N名成員每人有一個過河時間ti,每次划船過河的時間等於船上成員的過河時間的最大值。請你找N名成員全部到底對岸的最少耗時。
輸入
輸入包含多組測試資料。第一行含有一個正整數T,表示資料組數。
每組資料的第一行含有一個整數N。接下來的一行含有N個整數,表示ti。
輸出
對於每組輸入資料輸出一行,每行包括1個整數,代表該組資料下到對岸的最少耗時。
樣例輸入
2
4
1 2 5 10
5
1 2 8 7 6
樣例輸出
17
22
資料範圍
1≤T≤20
1≤N≤1000
1≤ti≤100
提示
船劃到對岸後不會自動飄回來的哦~
n>=4 時分兩種情況 選擇兩種情況中時間較短的那個(每次會送去兩個人 所以遞推n-=2)
一種情況是 最快的和最慢去 最快的回來 最快的和次慢的去 最快的回來
另一種情況 最快的和次快的去 最快的回來 然後最慢的和次慢的去 次快的回來
n=3時 為三個時間的總和
n=2時 為較快的那個時間
#include<stdio.h>
int a[1010];
void quick_sort(int left,int right)
{
int i,j,temp,t;
if(left>right)
return;
temp=a[left];
i=left;
j=right;
while(i!=j)
{
while(a[j]>=temp&&i<j)
j--;
while(a[i]<=temp&&i<j)
i++;
//沒相遇時交換
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];
a[i]=temp;
quick_sort(left,i-1);
quick_sort(i+1,right);
return;
}
int min(int x,int y)
{
int m;
m=x;
if(y<x)
m=y;
return m;
}
int main()
{
int x;
int ans,i,j,s1,s2;
scanf("%d",&x);
while(x--)
{ int n;
ans=0,s1=0,s2=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
//sort(a,a+n);
quick_sort(1,n);
while(n>0)
{
if(n>=4)
{ s1=a[n]+a[n-1]+a[1]+a[1];
s2=a[1]+a[2]+a[n]+a[2];
ans+=min(s1,s2);
n=n-2;
}
else if(n==3)
{ ans+=a[1]+a[2]+a[3];
n=n-3;
}
else if(n<=2)
{
ans+=a[n];
n=n-2;}
}printf("%d\n",ans);
}
}
H - 超市
超市裡有N個商品. 第i個商品必須在保質期(第di天)之前賣掉, 若賣掉可讓超市獲得pi的利潤.
每天只能賣一個商品.
現在你要讓超市獲得最大的利潤.
(原題說明過於抽象)
Input
多組資料.
每組資料第一行為N, 即超市的商品數目
之後N行數字. 第i行為 pi, di
N , pi, di <= 10000
Output
對於每一組資料, 輸出當前條件下超市的最大利潤
Sample Input
4
50 2
10 1
20 2
30 1
7
20 1
2 1
10 3
100 2
8 2
5 20
50 10
Sample Output
80
185
思路:以錢來排序 從一遍歷對應時間 有空閒天數即可賣出
book用於標記是否賣出
#include<stdio.h>
#include<algorithm>
using namespace std;
int book[100001];
struct fact
{
int money;
int time;
}a[100001];
bool cmp(struct fact x,struct fact y)
{
return x.money>y.money;
}
int main()
{
int n,i,j,ans;
while(scanf("%d",&n)!=EOF)
{
ans=0;
for(i=0;i<n;i++)
scanf("%d %d",&a[i].money,&a[i].time);
sort(a,a+n,cmp);
//for(i=0;i<n;i++)
//printf("%d ",a[i].money);
for(i=0;i<n;i++)
for(j=a[i].time;j>=1;j--)
{
if(book[j]==0)
{
book[j]=1;
ans+=a[i].money ;
break;
}
}
printf("%d\n",ans);
for(i=0;i<=10000;i++)
book[i]=0;
}
return 0;
}
I - 放蘋果
把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。
Input
第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數M和N,以空格分開。1<=M,N<=10。
Output
對輸入的每組資料M和N,用一行輸出相應的K。
Sample Input
1
7 3
Sample Output
8
O - 拯救X先生
話說上回講到海東集團面臨內外交困,公司的元老也只剩下XHD夫婦二人了。顯然,作為多年拼搏的商人,XHD不會坐以待斃的。
一天,當他正在苦思冥想解困良策的時候,突然想到了自己的傳家寶,那是公司成立的時候,父親作為賀禮送來的一個錦囊,徐父當時交代,不到萬不得已的時候,不要開啟它。“現在不正是最需要的時候嗎?”,一邊想,XHD一邊找到了這個精心保管的錦囊,開啟一看,裡面只有一句話“杭城北麓千人洞有寶”。
二話不說,XHD拿起一個大口袋就出發了,這個千人洞他是知道的,小的時候,爸爸曾經帶他來過這個隱蔽的路口,並告訴他,這是千人洞。他現在才明白爸爸當初這句話的含義。
儘管有點印象,XHD還是花了很大的精力才找到這個異常隱蔽的洞口,走進一看,幾乎驚呆了,真的是眼花繚亂!不過儘管寶貝的種類不少,但是每種寶貝的量並不多,當然,每種寶貝單位體積的價格也不一樣,為了挽救HDU,現在請你幫忙儘快計算出來XHD最多能帶回多少價值的寶貝?(假設寶貝可以分割,分割後的價值和對應的體積成正比)
Input
輸入包含多個測試例項,每個例項的第一行是兩個整數v和n(v,n<100),分別表示口袋的容量和寶貝的種類,接著的n行每行包含2個整數pi和mi(0<pi,mi<10),分別表示某種寶貝的單價和對應的體積,v為0的時候結束輸入。
Output
對於每個測試例項,請輸出XHD最多能取回多少價值的寶貝,每個例項的輸出佔一行。
Sample Input
2 2
3 1
2 3
0
思路:體積相減作為判斷條件
#include<stdio.h>
#include<algorithm>
#include<cstdio>
using namespace std;
struct f
{
int price;
int v;
}a[1010];
bool cmp(f x, f y)
{
return x.price>y.price;
}
int main()
{
int n,m,ans,sum=0,count=0,i;
while(scanf("%d",&m)!=EOF)
{ if(m==0)
return 0;
sum=0,count=0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d %d",&a[i].price,&a[i].v);
ans=0;
sort(a,a+n,cmp);
for(i=0;i<n;i++)
{
if(m>=a[i].v)
{
ans+=a[i].price*a[i].v;
m-=a[i].v;
if(m==0)
break;
}
else
{
ans+=(m*a[i].price);
break;
}
}
printf("%d\n",ans);
}
return 0;
}
奇怪的電梯
呵呵,有一天我做了一個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第ii層樓(1 \le i \le N)(1≤i≤N)上有一個數字K_i(0 \le K_i \le N)K
i
(0≤K
i
≤N)。電梯只有四個按鈕:開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如:3, 3 ,1 ,2 ,53,3,1,2,5代表了K_i(K_1=3,K_2=3,…)K
i
(K
1
=3,K
2
=3,…),從11樓開始。在11樓,按“上”可以到44樓,按“下”是不起作用的,因為沒有-2−2樓。那麼,從AA樓到BB樓至少要按幾次按鈕呢?
輸入格式
共二行。
第一行為33個用空格隔開的正整數,表示N,A,B(1≤N≤200, 1≤A,B≤N)N,A,B(1≤N≤200,1≤A,B≤N)。
第二行為NN個用空格隔開的非負整數,表示K_iK
i
。
輸出格式
一行,即最少按鍵次數,若無法到達,則輸出-1−1。
輸入輸出樣例
輸入 #1複製
5 1 5
3 3 1 2 5
輸出 #1複製
3
典型搜素問題 學習點一 cnt 二模板 dfs()函式中 結束條件 標記=1(開始遍歷) 滿足條件下一步沒標記的話 進行下一步搜素 否則取消標記
#include<stdio.h>
int x,y,cnt,m=10000,i,book[1010],a[1010],n,ans;
void dfs(int c)
{
if(cnt>=m)
return;
if(c==y)
{
m=cnt;
return;
}
book[c]=1;
cnt++;
if(c+a[c]<=n&&book[c+a[c]]==0)
dfs(c+a[c]);
if(c-a[c]>=1&&book[c-a[c]]==0)
dfs(c-a[c]);
cnt--;
book[c]=0;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0)
return 0;
scanf("%d %d",&x,&y);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
dfs(x);
if(m==10000)
printf("-1\n");
else
printf("%d\n",m);}
}
(同樣的題在洛谷能通過 vjudge平臺上不行?)