1. 程式人生 > >2017-10-24 NOIP模擬賽

2017-10-24 NOIP模擬賽

b- 不一定 urn 要求 接下來 time -a -- 技術分享

括號序列

(bracket)

Time Limit:1000ms Memory Limit:128MB

題目描述

LYK有一個括號序列,但這個序列不一定合法。

一個合法的括號序列如下:

()是合法的括號序列。

若A是合法的括號序列,則(A)是合法的括號序列。

若A和B分別是合法的括號序列,則AB是合法的括號序列。

LYK想通過盡可能少的操作將這個不一定合法的括號序列變成合法的括號序列。一次修改操作是將某個字符變成另一個字符。

你能幫幫它嗎?

輸入格式(bracket.in)

一行一個字符串S。

輸出格式(bracket.out)

一個數表示最少修改次數。

輸入樣例

()))

輸出樣例

1

樣例解釋

將第二個字符修改成(即可。

數據範圍

對於30%的數據|S|<=10。

對於60%的數據|S|<=1000。

對於100%的數據|S|<=100000。且|S|是偶數。

技術分享
/*
    這個題不能單純判斷左括號和右括號的多少,而應該從左到右掃一遍,看應該如何配對 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[100010];
int cnt,ans;
int main(){ freopen("bracket.in","r",stdin);freopen("bracket.out","w",stdout); //freopen("Cola.txt","r",stdin); scanf("%s",s+1); int len=strlen(s+1); for(int i=1;i<=len;i++){ if(s[i]==)){ if(cnt==0)cnt++,ans++; else cnt--; }
else cnt++; } ans+=cnt/2; cout<<ans; }
AC 模擬

公交車

(bus)

Time Limit:1000ms Memory Limit:128MB

題目描述

LYK在玩一個遊戲。

有k群小怪獸想乘坐公交車。第i群小怪獸想從xi出發乘坐公交車到yi。但公交車的容量只有M,而且這輛公交車只會從1號點行駛到n號點。

LYK想讓小怪獸們盡可能的到達自己想去的地方。它想知道最多能滿足多少小怪獸的要求。

當然一群小怪獸沒必要一起上下車,它們是可以被分開來的。

輸入格式(bus.in)

第一行三個數k,n,M。

接下來k行每行3個數xi,yi和ci。其中ci表示第i群小怪獸的小怪獸數量。

輸出格式(bus.out)

一個數表示最多有多少只小怪獸能滿足要求。

輸入樣例

3 5 3

1 3 4

3 5 2

1 5 3

輸出樣例

5

樣例解釋

第一群的3只小怪獸在1號點上車,並在3號點下車。

第二群的2只小怪獸在3號點上車,5號點下車。

數據範圍

對於30%的數據小怪獸的總數不超過10只,n<=10。

對於另外30%的數據k,n<=1000。

對於100%的數據1<=n<=20000,1<=k<=50000,1<=M<=100,1<=ci<=100,1<=xi<yi<=n。

技術分享
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int ans,n,m,c,w[20010];
struct node{
    int l,r,v;
    bool operator < (const node b)const{
        return r<b.r;
    }
}a[50010];
int main(){
    freopen("bus.in","r",stdin);freopen("bus.out","w",stdout);
    scanf("%d%d%d",&n,&m,&c);
    for(int i=1;i<=m;i++)w[i]=c;
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].v);
        a[i].r--;
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=m;i++){
        int mn=a[i].v;
        for(int j=a[i].l;j<=a[i].r;j++)mn=min(mn,w[j]);
        if(mn!=0){
            for(int j=a[i].l;j<=a[i].r;j++)w[j]-=mn;
            ans+=mn;
        }
    }
    printf("%d",ans);
}
60分 貪心+暴力

解謎遊戲

(puzzle)

Time Limit:1000ms Memory Limit:128MB

題目描述

LYK進了一家古董店,它很想買其中的一幅畫。但它帶的錢不夠買這幅畫。

幸運的是,老板正在研究一個問題,他表示如果LYK能幫他解出這個問題的話,就把這幅畫送給它。

老板有一個n*m的矩陣,他想找一個和最大的子矩陣,這個子矩陣可以由四個參數x,y,x2,y2(1<=x<=x2<=n,1<=y<=y2<=m)來表示,表示一個左上角為(x,y),右下角為(x2,y2)的矩陣。

為了讓遊戲更加有趣,老板給了一個常數P,他想將原來這個矩陣中恰好一個數變為P,使得這個矩陣的最大的子矩陣盡可能大。

老板想知道這個最大值是多少。

你能幫幫LYK嗎?

輸入格式(puzzle.in)

第一行三個數n,m,P。

接下來n行,每行m個數ai,j描述整個矩陣。

輸出格式(puzzle.out)

輸出一個數表示答案。

輸入樣例

3 3 3

-100 3 3

3 -4 3

3 3 3

輸出樣例

20

樣例解釋

改變左上角那個數。

數據範圍

對於20%的數據n,m<=10。

對於40%的數據n,m<=25。

對於60%的數據n,m<=50。

對於80%的數據n,m<=100。

對於100%的數據1<=n,m<=300,|P|,|ai,j|<=1000。

2017-10-24 NOIP模擬賽