Python\C++| CCFCSP 第三題

試題編號: 201312-3
試題名稱: 最大的矩形
時間限制: 1.0s
內存限制: 256.0MB
問題描述:

問題描述

  在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i(1 ≤ i ≤ n)個矩形的高度是hi。這n個矩形構成了一個直方圖。例如,下圖中六個矩形的高度就分別是3, 1, 6, 5, 2, 3。



  請找出能放在給定直方圖裏面積最大的矩形,它的邊要與座標軸平行。對於上面給出的例子,最大矩形如下圖所示的陰影部分,面積是10。

輸入格式

  第一行包含一個整數n,即矩形的數量(1 ≤ n ≤ 1000)。
  第二行包含n 個整數h1, h2, … , hn,相鄰的數之間由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i個矩形的高度。

輸出格式

  輸出一行,包含一個整數,即給定直方圖內的最大矩形的面積。

樣例輸入

6
3 1 6 5 2 3

樣例輸出

10

#include <iostream>
#include <cstring>
#include <algorithm>
#include <algorithm>
using namespace std;
int  tt[1005];
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int n,l,t;
    while(cin>>n)
    {
        int ans=0;
        int maxn=0;
        for(int i=0; i<n; i++)
        {
            cin>>tt[i];
            maxn=max(maxn,tt[i]);
        }
        for(int i=1;i<n;i++)
        {
            if(tt[i]==0)
                break;
            else
            {
                int cnt=0;
                for(int j=0;j<n;j++)
                {
                    if(tt[j]-tt[i]<0)
                        cnt=0;
                    else
                        cnt++;
                    maxn=max(maxn,cnt*tt[i]);
                }
            }
        }
        cout<<maxn<<endl;
    }
}
試題編號: 201403-3
試題名稱: 命令行選項
時間限制: 1.0s
內存限制: 256.0MB
問題描述:

問題描述

  請你寫一個命令行分析程序,用以分析給定的命令行裏包含哪些選項。每個命令行由若干個字符串組成,它們之間恰好由一個空格分隔。這些字符串中的第一個爲該命令行工具的名字,由小寫字母組成,你的程序不用對它進行處理。在工具名字之後可能會包含若干選項,然後可能會包含一 些不是選項的參數。
  選項有兩類:帶參數的選項和不帶參數的選項。一個合法的無參數選項的形式是一個減號後面跟單個小寫字母,如"-a" 或"-b"。而帶參數選項則由兩個由空格分隔的字符串構成,前者的格式要求與無參數選項相同,後者則是該選項的參數,是由小寫字母,數字和減號組成的非空字符串。
  該命令行工具的作者提供給你一個格式字符串以指定他的命令行工具需要接受哪些選項。這個字符串由若干小寫字母和冒號組成,其中的每個小寫字母表示一個該程序接受的選項。如果該小寫字母后面緊跟了一個冒號,它就表示一個帶參數的選項,否則則爲不帶參數的選項。例如, "ab:m:" 表示該程序接受三種選項,即"-a"(不帶參數),"-b"(帶參數), 以及"-m"(帶參數)。
  命令行工具的作者準備了若干條命令行用以測試你的程序。對於每個命令行,你的工具應當一直向後分析。當你的工具遇到某個字符串既不是合法的選項,又不是某個合法選項的參數時,分析就停止。命令行剩餘的未分析部分不構成該命令的選項,因此你的程序應當忽略它們。

輸入格式

  輸入的第一行是一個格式字符串,它至少包含一個字符,且長度不超過 52。格式字符串只包含小寫字母和冒號,保證每個小寫字母至多出現一次,不會有兩個相鄰的冒號,也不會以冒號開頭。
  輸入的第二行是一個正整數 N(1 ≤ N ≤ 20),表示你需要處理的命令行的個數。
  接下來有 N 行,每行是一個待處理的命令行,它包括不超過 256 個字符。該命令行一定是若干個由單個空格分隔的字符串構成,每個字符串裏只包含小寫字母,數字和減號。

輸出格式

  輸出有 N 行。其中第 i 行以"Case i:" 開始,然後應當有恰好一個空格,然後應當按照字母升序輸出該命令行中用到的所有選項的名稱,對於帶參數的選項,在輸出它的名稱之後還要輸出它的參數。如果一個選項在命令行中出現了多次,只輸出一次。如果一個帶參數的選項在命令行中出 現了多次,只輸出最後一次出現時所帶的參數。

樣例輸入

albw:x
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l

樣例輸出

Case 1: -a -l
Case 2:
Case 3: -w 15 -x
Case 4: -a -b

Python 實現

import sys
a=sys.stdin.readline()
a=a.strip()
b=sys.stdin.readline()
b=b.strip()
cnt=int(b)
for case in range(0,cnt):
    cmd = sys.stdin.readline()
    cmd=cmd.strip()
    cmd=cmd.replace('\n','')
    cmd=cmd.split(" ")
    ans = {}
    l=len(cmd)
    f=len(a)
    i=1
    while(i<=l-1):
        if(cmd[i][0]=='-' and len(cmd[i])==2):
            index=a.find(cmd[i][1])
            if(index==-1):
                break
            if(index + 1 == f):
                ans[cmd[i]] = '0'
            elif(a[index+1]==':'):
                if(i+1==l):
                    break
                else:
                    ans[cmd[i]]=cmd[i+1]
                    i+=1
            else:
                ans[cmd[i]] = '0'
        else:
            break
        i+=1
    slove=sorted(ans.items(), key=lambda d: d[0])
    s="Case "+str(case+1)+": "
    for h in slove:
        key,value=h
        if(value=='0'):
            s+=(key+" ")
        else :
            s+=(key+" "+value+" ")
    s+='\n'
    sys.stdout.write(s)
試題編號: 201409-3
試題名稱: 字符串匹配
時間限制: 1.0s
內存限制: 256.0MB
問題描述:

問題描述

  給出一個字符串和多行文字,在這些文字中找到字符串出現的那些行。你的程序還需支持大小寫敏感選項:當選項打開時,表示同一個字母的大寫和小寫看作不同的字符;當選項關閉時,表示同一個字母的大寫和小寫看作相同的字符。

輸入格式

  輸入的第一行包含一個字符串S,由大小寫英文字母組成。
  第二行包含一個數字,表示大小寫敏感的選項,當數字爲0時表示大小寫不敏感,當數字爲1時表示大小寫敏感。
  第三行包含一個整數n,表示給出的文字的行數。
  接下來n行,每行包含一個字符串,字符串由大小寫英文字母組成,不含空格和其他字符。

輸出格式

  輸出多行,每行包含一個字符串,按出現的順序依次給出那些包含了字符串S的行。

樣例輸入

Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello

樣例輸出

HelloWorld
HiHiHelloHiHi
HELLOisNOTHello

樣例說明

  在上面的樣例中,第四個字符串雖然也是Hello,但是大小寫不正確。如果將輸入的第二行改爲0,則第四個字符串應該輸出。

評測用例規模與約定

  1<=n<=100,每個字符串的長度不超過100。

import sys
a=sys.stdin.readline()
a=a.strip()
c=sys.stdin.readline()
c=c.strip()
b=sys.stdin.readline()
b=b.strip()
cnt=int(b)
test=[]
for case in range(0,cnt):
    d=sys.stdin.readline()
    d=d.strip()
    test.append(d)
if(c=='0'):
    a=a.lower()
for tt in test :
    cc=tt
    if (c == '0'):
        cc=cc.lower()
    if(a in cc):
        sys.stdout.write(tt+'\n')
試題編號: 201412-3
試題名稱: 集合競價
時間限制: 1.0s
內存限制: 256.0MB
問題描述:

問題描述

  某股票交易所請你編寫一個程序,根據開盤前客戶提交的訂單來確定某特定股票的開盤價和開盤成交量。
  該程序的輸入由很多行構成,每一行爲一條記錄,記錄可能有以下幾種:
  1. buy p s 表示一個購買股票的買單,每手出價爲p,購買股數爲s。
  2. sell p s 表示一個出售股票的賣單,每手出價爲p,出售股數爲s。
  3. cancel i表示撤銷第i行的記錄。
  如果開盤價爲p0,則系統可以將所有出價至少爲p0的買單和所有出價至多爲p0的賣單進行匹配。因此,此時的開盤成交量爲出價至少爲p0的買單的總股數和所有出價至多爲p0的賣單的總股數之間的較小值。
  你的程序需要確定一個開盤價,使得開盤成交量儘可能地大。如果有多個符合條件的開盤價,你的程序應當輸出最高的那一個。

輸入格式

  輸入數據有任意多行,每一行是一條記錄。保證輸入合法。股數爲不超過108的正整數,出價爲精確到恰好小數點後兩位的正實數,且不超過10000.00。

輸出格式

  你需要輸出一行,包含兩個數,以一個空格分隔。第一個數是開盤價,第二個是此開盤價下的成交量。開盤價需要精確到小數點後恰好兩位。

樣例輸入

buy 9.25 100
buy 8.88 175
sell 9.00 1000
buy 9.00 400
sell 8.92 400
cancel 1
buy 100.00 50

樣例輸出

9.00 450

評測用例規模與約定

  對於100%的數據,輸入的行數不超過5000。

不知道該怎麼優化了 70分代碼

import sys
tt={}
i=1
while True:
    line=sys.stdin.readline().strip()
    if not line:
        break
    if(line[0]=='c'):
        x,y=line.split(" ")
        tt[i]='0'
        tt[int(y)]='0'
    else:
        value=line.split(" ")
        tt[i]=(value[0],float(value[1]),int(value[2]))
    i+=1

sum=0
all=0
ansp=0.0
i=0
for i in range(1,len(tt)+1):
    buy=0
    sell=0
    if(tt[i]=='0'):
        continue
    for j in range(1,len(tt)+1):
        if (tt[j] == '0'):
            continue
        if(tt[j][0][0]=='b'and tt[j][1]>=tt[i][1]):
            buy+=tt[j][2]
        if (tt[j][0][0] == 's' and tt[j][1] <= tt[i][1]):
            sell += tt[j][2]
    sum=min(sell,buy)
    if sum>all:
        all=sum
        ansp=tt[i][1]
    if sum == all:
        ansp=max(ansp,tt[i][1])
ansp='%.2f'%ansp
sys.stdout.write(ansp+" "+str(all)+'\n')
試題編號: 201503-3
試題名稱: 節日
時間限制: 1.0s
內存限制: 256.0MB
問題描述:

問題描述

  有一類節日的日期並不是固定的,而是以“a月的第b個星期c”的形式定下來的,比如說母親節就定爲每年的五月的第二個星期日。
  現在,給你abcy1, y2(1850 ≤ y1, y2 ≤ 2050),希望你輸出從公元y1年到公元y2年間的每年的a月的第b個星期c的日期。
  提示:關於閏年的規則:年份是400的整數倍時是閏年,否則年份是4的倍數並且不是100的倍數時是閏年,其他年份都不是閏年。例如1900年就不是閏年,而2000年是閏年。
  爲了方便你推算,已知1850年1月1日是星期二。

輸入格式

  輸入包含恰好一行,有五個整數abcy1, y2。其中c=1, 2, ……, 6, 7分別表示星期一、二、……、六、日。

輸出格式

  對於y1和y2之間的每一個年份,包括y1和y2,按照年份從小到大的順序輸出一行。
  如果該年的a月第b個星期c確實存在,則以"yyyy/mm/dd"的格式輸出,即輸出四位數的年份,兩位數的月份,兩位數的日期,中間用斜槓“/”分隔,位數不足時前補零。
  如果該年的a月第b個星期c並不存在,則輸出"none"(不包含雙引號)。

樣例輸入

5 2 7 2014 2015

樣例輸出

2014/05/11
2015/05/10

評測用例規模與約定

  所有評測用例都滿足:1 ≤ a ≤ 12,1 ≤ b ≤ 5,1 ≤ c ≤ 7,1850 ≤ y1, y2 ≤ 2050。

import sys

day = [29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
month = list(range(1, 13))
year = list(range(1850, 2051))
data = {}
week = 2
i = 0
for y in year:
    if ((y % 4 == 0 and y % 100 != 0) or y % 400 == 0):
        day[2] = day[0]
    for m in month:
        da = day[m]
        for d in range(1, da + 1):
            # print(str(y)+' '+str(m)+' '+str(d)+' '+str(week))
            data[i] = tuple((y, m, d, week))
            week += 1
            week %= 7
            i += 1
    day[2] = 28
line = sys.stdin.readline().strip()
line = line.split(" ")
line = [int(v) for v in line]
line[2] %= 7
a = False
i = 0
nowy = line[3]
k = 0
while (k < len(data)):
    if (data[k][1] == line[0] and data[k][0] >= line[3] and data[k][0] <= line[4] and data[k][3] == line[2]):
        i += 1
        if (i == line[1]):
            a = True
            sys.stdout.write(str(data[k][0]) + '/' + str('%0.2d' % data[k][1]) + '/' + str('%0.2d' % data[k][2]) + '\n')
    if (data[k][1]==12 and data[k][2]==31 and data[k][0] >= line[3] and data[k][0] <= line[4]):
        if(a==False):
            sys.stdout.write('none' + '\n')
        i = 0
        a=False
    k += 1
試題編號: 201509-3
試題名稱: 模板生成系統
時間限制: 1.0s
內存限制: 256.0MB
問題描述:

問題描述

  成成最近在搭建一個網站,其中一些頁面的部分內容來自數據庫中不同的數據記錄,但是頁面的基本結構是相同的。例如,對於展示用戶信息的頁面,當用戶爲 Tom 時,網頁的源代碼是


  而當用戶爲 Jerry 時,網頁的源代碼是


  這樣的例子在包含動態內容的網站中還有很多。爲了簡化生成網頁的工作,成成覺得他需要引入一套模板生成系統。
  模板是包含特殊標記的文本。成成用到的模板只包含一種特殊標記,格式爲 {{ VAR }},其中 VAR 是一個變量。該標記在模板生成時會被變量 VAR 的值所替代。例如,如果變量 name = "Tom",則 {{ name }} 會生成 Tom。具體的規則如下:
  ·變量名由大小寫字母、數字和下劃線 (_) 構成,且第一個字符不是數字,長度不超過 16 個字符。
  ·變量名是大小寫敏感的,Name 和 name 是兩個不同的變量。
  ·變量的值是字符串。
  ·如果標記中的變量沒有定義,則生成空串,相當於把標記從模板中刪除。
  ·模板不遞歸生成。也就是說,如果變量的值中包含形如 {{ VAR }} 的內容,不再做進一步的替換。

輸入格式

  輸入的第一行包含兩個整數 mn,分別表示模板的行數和模板生成時給出的變量個數。
  接下來 m 行,每行是一個字符串,表示模板。
  接下來 n 行,每行表示一個變量和它的值,中間用一個空格分隔。值是字符串,用雙引號 (") 括起來,內容可包含除雙引號以外的任意可打印 ASCII 字符(ASCII 碼範圍 32, 33, 35-126)。

輸出格式

  輸出包含若干行,表示模板生成的結果。

樣例輸入

11 2
<!DOCTYPE html>
<html>
<head>
<title>User {{ name }}</title>
</head>
<body>
<h1>{{ name }}</h1>
<p>Email: <a href="mailto:{{ email }}">{{ email }}</a></p>
<p>Address: {{ address }}</p>
</body>
</html>
name "David Beckham"
email "[email protected]"

樣例輸出

<!DOCTYPE html>
<html>
<head>
<title>User David Beckham</title>
</head>
<body>
<h1>David Beckham</h1>
<p>Email: <a href="mailto:[email protected]">[email protected]</a></p>
<p>Address: </p>
</body>
</html>

評測用例規模與約定

  0 ≤ m ≤ 100
  0 ≤ n ≤ 100
  輸入的模板每行長度不超過 80 個字符(不包含換行符)。
  輸入保證模板中所有以 {{ 開始的子串都是合法的標記,開始是兩個左大括號和一個空格,然後是變量名,結尾是一個空格和兩個右大括號。
  輸入中所有變量的值字符串長度不超過 100 個字符(不包括雙引號)。
  保證輸入的所有變量的名字各不相同。

import sys
import re
line = sys.stdin.readline().strip()
line = line.split(" ")
line = [int(v) for v in line]
i=0
kk={}
ht={}
for _ in range(0,line[0]):
    html = sys.stdin.readline().strip()

    g=re.findall(r"{{ (.+?) }}",html)
    #print(g)
    for x in g:
        s='{{ '
        s+=x
        s+=' }}'
        kk[s]=''
    ht[i] = html
    i += 1
for _ in range(0,line[1]):
    pat = sys.stdin.readline().strip()
    a,b=pat.split(" ",1)
    b=b.strip('"')
    s = '{{ '
    s += a
    s += ' }}'
    if(s in kk):
        kk[s]=b
ll=0
for ll in range(0,len(ht)):
    for a,b in kk.items():
        if(a in ht[ll]):
         ht[ll]=ht[ll].replace(a,b)
    print(ht[ll])
試題編號: 201512-3
試題名稱: 畫圖
時間限制: 1.0s
內存限制: 256.0MB
問題描述:

問題描述

  用 ASCII 字符來畫圖是一件有趣的事情,並形成了一門被稱爲 ASCII Art 的藝術。例如,下圖是用 ASCII 字符畫出來的 CSPRO 字樣。
  ..____.____..____..____...___..
  ./.___/.___||.._.\|.._.\./._.\.
  |.|...\___.\|.|_).|.|_).|.|.|.|
  |.|___.___).|..__/|.._.<|.|_|.|
  .\____|____/|_|...|_|.\_\\___/.
  本題要求編程實現一個用 ASCII 字符來畫圖的程序,支持以下兩種操作:
   畫線:給出兩個端點的座標,畫一條連接這兩個端點的線段。簡便起見題目保證要畫的每條線段都是水平或者豎直的。水平線段用字符 - 來畫,豎直線段用字符 | 來畫。如果一條水平線段和一條豎直線段在某個位置相交,則相交位置用字符 + 代替。
   填充:給出填充的起始位置座標和需要填充的字符,從起始位置開始,用該字符填充相鄰位置,直到遇到畫布邊緣或已經畫好的線段。注意這裏的相鄰位置只需要考慮上下左右 4 個方向,如下圖所示,字符 @ 只和 4 個字符 * 相鄰。
  .*.
  *@*
  .*.

輸入格式

  第1行有三個整數mnqmn分別表示畫布的寬度和高度,以字符爲單位。q表示畫圖操作的個數。
  第2行至第q + 1行,每行是以下兩種形式之一:
   0 xyxy2:表示畫線段的操作,(x1, y1)和(x2, y2)分別是線段的兩端,滿足要麼x1 = x2 且y1 ≠ y2,要麼 y1 = y2 且 x1 ≠ x2。
   1 x y c:表示填充操作,(xy)是起始位置,保證不會落在任何已有的線段上;c 爲填充字符,是大小寫字母。
  畫布的左下角是座標爲 (0, 0) 的位置,向右爲x座標增大的方向,向上爲y座標增大的方向。這q個操作按照數據給出的順序依次執行。畫布最初時所有位置都是字符 .(小數點)。

輸出格式

  輸出有n行,每行m個字符,表示依次執行這q個操作後得到的畫圖結果。

樣例輸入

4 2 3
1 0 0 B
0 1 0 2 0
1 0 0 A

樣例輸出

AAAA
A--A

樣例輸入

16 13 9
0 3 1 12 1
0 12 1 12 3
0 12 3 6 3
0 6 3 6 9
0 6 9 12 9
0 12 9 12 11
0 12 11 3 11
0 3 11 3 1
1 4 2 C

樣例輸出

................
...+--------+...
...|CCCCCCCC|...
...|CC+-----+...
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC+-----+...
...|CCCCCCCC|...
...+--------+...
................

評測用例規模與約定

  所有的評測用例滿足:2 ≤ mn ≤ 100,0 ≤ q ≤ 100,0 ≤ x < mx表示輸入數據中所有位置的x座標),0 ≤ y < ny表示輸入數據中所有位置的y座標)。

又是運行錯誤  90分代碼

import sys
line = sys.stdin.readline().strip()
line = line.split()
line[0]=int(line[0])
line[1]=int(line[1])
line[2]=int(line[2])
#line = [int(v) for v in line]
ans = [(['.'] * line[0]) for _ in range(line[1])]
vis= [([0] * line[0]) for _ in range(line[1])]
che = ['-', '|', '+']
dir=[[1,0],[-1,0],[0,-1],[0,1]]
def check(xx,yy):
    if(xx>=0 and yy>=0 and xx<line[1] and yy<line[0] ):
        if(ans[xx][yy] not in che and vis[xx][yy]==0):
            return True
        else:
            return False
    else:
        return False
def solve(xx,yy,pad):
    if (check(xx,yy)):
        vis[xx][yy] = 1
        ans[xx][yy] = pad
        for dire in dir:
            ccx = xx + dire[0]
            ccy = yy + dire[1]
            if (check(ccx, ccy)):
                solve(ccx, ccy, pad)
for _ in range(0, line[2]):
    cmd = sys.stdin.readline().strip()
    cmd = cmd.split()
    if (cmd[0] == '0'):
        cmd[1]=int(cmd[1])
        cmd[2]=int(cmd[2])
        cmd[3]=int(cmd[3])
        cmd[4]=int(cmd[4])
        if (cmd[1] == cmd[3]):
            for c in range(min(cmd[2], cmd[4]), max(cmd[2], cmd[4]) + 1):
                if (ans[c][cmd[1]] == '-' or ans[c][cmd[1]] == '+'):
                    ans[c][cmd[1]] = '+'
                else:
                    ans[c][cmd[1]] = '|'
        else:
            for c in range(min(cmd[1], cmd[3]), max(cmd[1], cmd[3])+1):
                # print(str(cmd[2]) + " " + str(c))
                if (ans[cmd[2]][c] == '|' or ans[cmd[2]][c] == '+'):
                    ans[cmd[2]][c] = '+'
                else:
                    ans[cmd[2]][c] = '-'
    else:
        sty = int(cmd[1])
        stx = int(cmd[2])
        if(check(stx,sty)):
            vis = [([0] * line[0]) for _ in range(line[1])]
            solve(stx,sty,cmd[3])
for pp in range(len(ans) - 1, -1, -1):
    for q in ans[pp]:
        sys.stdout.write(q)
    sys.stdout.write('\n')

試題編號: 201604-3
試題名稱: 路徑解析
時間限制: 1.0s
內存限制: 256.0MB
問題描述:

問題描述

  在操作系統中,數據通常以文件的形式存儲在文件系統中。文件系統一般採用層次化的組織形式,由目錄(或者文件夾)和文件構成,形成一棵樹的形狀。文件有內容,用於存儲數據。目錄是容器,可包含文件或其他目錄。同一個目錄下的所有文件和目錄的名字各不相同,不同目錄下可以有名字相同的文件或目錄。
  爲了指定文件系統中的某個文件,需要用路徑來定位。在類 Unix 系統(Linux、Max OS X、FreeBSD等)中,路徑由若干部分構成,每個部分是一個目錄或者文件的名字,相鄰兩個部分之間用 / 符號分隔。
  有一個特殊的目錄被稱爲根目錄,是整個文件系統形成的這棵樹的根節點,用一個單獨的 / 符號表示。在操作系統中,有當前目錄的概念,表示用戶目前正在工作的目錄。根據出發點可以把路徑分爲兩類:
   絕對路徑:以 / 符號開頭,表示從根目錄開始構建的路徑。
   相對路徑:不以 / 符號開頭,表示從當前目錄開始構建的路徑。

  例如,有一個文件系統的結構如下圖所示。在這個文件系統中,有根目錄 / 和其他普通目錄 d1、d2、d3、d4,以及文件 f1、f2、f3、f1、f4。其中,兩個 f1 是同名文件,但在不同的目錄下。

  對於 d4 目錄下的 f1 文件,可以用絕對路徑 /d2/d4/f1 來指定。如果當前目錄是 /d2/d3,這個文件也可以用相對路徑 ../d4/f1 來指定,這裏 .. 表示上一級目錄(注意,根目錄的上一級目錄是它本身)。還有 . 表示本目錄,例如 /d1/./f1 指定的就是 /d1/f1。注意,如果有多個連續的 / 出現,其效果等同於一個 /,例如 /d1///f1 指定的也是 /d1/f1。
  本題會給出一些路徑,要求對於每個路徑,給出正規化以後的形式。一個路徑經過正規化操作後,其指定的文件不變,但是會變成一個不包含 . 和 .. 的絕對路徑,且不包含連續多個 / 符號。如果一個路徑以 / 結尾,那麼它代表的一定是一個目錄,正規化操作要去掉結尾的 /。若這個路徑代表根目錄,則正規化操作的結果是 /。若路徑爲空字符串,則正規化操作的結果是當前目錄。

輸入格式

  第一行包含一個整數 P,表示需要進行正規化操作的路徑個數。
  第二行包含一個字符串,表示當前目錄。
  以下 P 行,每行包含一個字符串,表示需要進行正規化操作的路徑。

輸出格式

  共 P 行,每行一個字符串,表示經過正規化操作後的路徑,順序與輸入對應。

樣例輸入

7
/d2/d3
/d2/d4/f1
../d4/f1
/d1/./f1
/d1///f1
/d1/
///
/d1/../../d2

樣例輸出

/d2/d4/f1
/d2/d4/f1
/d1/f1
/d1/f1
/d1
/
/d2

評測用例規模與約定

  1 ≤ P ≤ 10。
  文件和目錄的名字只包含大小寫字母、數字和小數點 .、減號 - 以及下劃線 _。
  不會有文件或目錄的名字是 . 或 .. ,它們具有題目描述中給出的特殊含義。
  輸入的所有路徑每個長度不超過 1000 個字符。
  輸入的當前目錄保證是一個經過正規化操作後的路徑。
  對於前 30% 的測試用例,需要正規化的路徑的組成部分不包含 . 和 .. 。
  對於前 60% 的測試用例,需要正規化的路徑都是絕對路徑。

用的大佬的思路  是真沒看懂題啊

import sys
line = sys.stdin.readline().strip()
n=int(line)
now=sys.stdin.readline().strip()
for _ in range(0, n):
    dir = sys.stdin.readline().strip()
    if(dir==""):
        sys.stdout.write(now+'\n')
        continue
    if(dir[0]!='/'):
        dir=now+'/'+dir
    dir=dir.replace('/',' ')
    dir=dir.split()
    #print(dir)
    ans=[]
    for x in dir:
        if (x=='.'):
            continue
        elif(x=='..'):
            if(len(ans)!=0):
                ans.pop()
        else:
            ans.append(x)
    sys.stdout.write('/')
    for i in range(0,len(ans)):
        if(i!=0):
            sys.stdout.write('/')
        sys.stdout.write(ans[i])
    sys.stdout.write('\n')








試題編號: 201609-3
試題名稱: 爐石傳說
時間限制: 1.0s
內存限制: 256.0MB
問題描述:

問題描述

  《爐石傳說:魔獸英雄傳》(Hearthstone: Heroes of Warcraft,簡稱爐石傳說)是暴雪娛樂開發的一款集換式卡牌遊戲(如下圖所示)。遊戲在一個戰鬥棋盤上進行,由兩名玩家輪流進行操作,本題所使用的爐石傳說遊戲的簡化規則如下:

  * 玩家會控制一些角色,每個角色有自己的生命值攻擊力。當生命值小於等於 0 時,該角色死亡。角色分爲英雄隨從
  * 玩家各控制一個英雄,遊戲開始時,英雄的生命值爲 30,攻擊力爲 0。當英雄死亡時,遊戲結束,英雄未死亡的一方獲勝。
  * 玩家可在遊戲過程中召喚隨從。棋盤上每方都有 7 個可用於放置隨從的空位,從左到右一字排開,被稱爲戰場。當隨從死亡時,它將被從戰場上移除。
  * 遊戲開始後,兩位玩家輪流進行操作,每個玩家的連續一組操作稱爲一個回合
  * 每個回合中,當前玩家可進行零個或者多個以下操作:
  1) 召喚隨從:玩家召喚一個隨從進入戰場,隨從具有指定的生命值和攻擊力。
  2) 隨從攻擊:玩家控制自己的某個隨從攻擊對手的英雄或者某個隨從。
  3) 結束回合:玩家聲明自己的當前回合結束,遊戲將進入對手的回合。該操作一定是一個回合的最後一個操作。
  * 當隨從攻擊時,攻擊方和被攻擊方會同時對彼此造成等同於自己攻擊力的傷害。受到傷害的角色的生命值將會減少,數值等同於受到的傷害。例如,隨從 X 的生命值爲 HX、攻擊力爲 AX,隨從 Y 的生命值爲 HY、攻擊力爲 AY,如果隨從 X 攻擊隨從 Y,則攻擊發生後隨從 X 的生命值變爲 HX - AY,隨從 Y 的生命值變爲 HY - AX。攻擊發生後,角色的生命值可以爲負數。
  本題將給出一個遊戲的過程,要求編寫程序模擬該遊戲過程並輸出最後的局面。

輸入格式

  輸入第一行是一個整數 n,表示操作的個數。接下來 n 行,每行描述一個操作,格式如下:
  <action> <arg1> <arg2> ...
  其中<action>表示操作類型,是一個字符串,共有 3 種:summon表示召喚隨從,attack表示隨從攻擊,end表示結束回合。這 3 種操作的具體格式如下:
  * summon <position> <attack> <health>:當前玩家在位置<position>召喚一個生命值爲<health>、攻擊力爲<attack>的隨從。其中<position>是一個 1 到 7 的整數,表示召喚的隨從出現在戰場上的位置,原來該位置及右邊的隨從都將順次向右移動一位。
  * attack <attacker> <defender>:當前玩家的角色<attacker>攻擊對方的角色 <defender>。<attacker>是 1 到 7 的整數,表示發起攻擊的本方隨從編號,<defender>是 0 到 7 的整數,表示被攻擊的對方角色,0 表示攻擊對方英雄,1 到 7 表示攻擊對方隨從的編號。
  * end:當前玩家結束本回合。
  注意:隨從的編號會隨着遊戲的進程發生變化,當召喚一個隨從時,玩家指定召喚該隨從放入戰場的位置,此時,原來該位置及右邊的所有隨從編號都會增加 1。而當一個隨從死亡時,它右邊的所有隨從編號都會減少 1。任意時刻,戰場上的隨從總是從1開始連續編號。

輸出格式

  輸出共 5 行。
  第 1 行包含一個整數,表示這 n 次操作後(以下稱爲 T 時刻)遊戲的勝負結果,1 表示先手玩家獲勝,-1 表示後手玩家獲勝,0 表示遊戲尚未結束,還沒有人獲勝。
  第 2 行包含一個整數,表示 T 時刻先手玩家的英雄的生命值。
  第 3 行包含若干個整數,第一個整數 p 表示 T 時刻先手玩家在戰場上存活的隨從個數,之後 p 個整數,分別表示這些隨從在 T 時刻的生命值(按照從左往右的順序)。
  第 4 行和第 5 行與第 2 行和第 3 行類似,只是將玩家從先手玩家換爲後手玩家。

樣例輸入

8
summon 1 3 6
summon 2 4 2
end
summon 1 4 5
summon 1 2 1
attack 1 2
end
attack 1 1

樣例輸出

0
30
1 2
30
1 2

樣例說明

  按照樣例輸入從第 2 行開始逐行的解釋如下:
  1. 先手玩家在位置 1 召喚一個生命值爲 6、攻擊力爲 3 的隨從 A,是本方戰場上唯一的隨從。
  2. 先手玩家在位置 2 召喚一個生命值爲 2、攻擊力爲 4 的隨從 B,出現在隨從 A 的右邊。
  3. 先手玩家回合結束。
  4. 後手玩家在位置 1 召喚一個生命值爲 5、攻擊力爲 4 的隨從 C,是本方戰場上唯一的隨從。
  5. 後手玩家在位置 1 召喚一個生命值爲 1、攻擊力爲 2 的隨從 D,出現在隨從 C 的左邊。
  6. 隨從 D 攻擊隨從 B,雙方均死亡。
  7. 後手玩家回合結束。
  8. 隨從 A 攻擊隨從 C,雙方的生命值都降低至 2。

評測用例規模與約定

  * 操作的個數0 ≤ n ≤ 1000。
  * 隨從的初始生命值爲 1 到 100 的整數,攻擊力爲 0 到 100 的整數。
  * 保證所有操作均合法,包括但不限於:
  1) 召喚隨從的位置一定是合法的,即如果當前本方戰場上有 m 個隨從,則召喚隨從的位置一定在 1 到 m + 1 之間,其中 1 表示戰場最左邊的位置,m + 1 表示戰場最右邊的位置。
  2) 當本方戰場有 7 個隨從時,不會再召喚新的隨從。
  3) 發起攻擊和被攻擊的角色一定存在,發起攻擊的角色攻擊力大於 0。
  4) 一方英雄如果死亡,就不再會有後續操作。
  * 數據約定:
  前 20% 的評測用例召喚隨從的位置都是戰場的最右邊。
  前 40% 的評測用例沒有 attack 操作。
  前 60% 的評測用例不會出現隨從死亡的情況。

import sys

line = sys.stdin.readline().strip()
n = int(line)
p1 = [[0, 30]]
p2 = [[0, 30]]
now = 1
for _ in range(0, n):
    x = sys.stdin.readline().strip()
    if (x[0] == 's'):
        x = x.split()
        p = int(x[1])
        a = int(x[2])
        h = int(x[3])
        if (now == 1):
            p1.insert(p, [a, h])
        else:
            p2.insert(p, [a, h])
    if (x[0] == 'a'):
        x = x.split()
        a = int(x[1])
        d = int(x[2])
        if (now == 1):
            p2[d][1] -= p1[a][0]
            p1[a][1] -= p2[d][0]
            if (p1[a][1] <= 0 and a!=0):
                p1.remove(p1[a])
            if (p2[d][1] <= 0 and d!=0):
                p2.remove(p2[d])
        else:
            p1[d][1] -= p2[a][0]
            p2[a][1] -= p1[d][0]
            if (p2[a][1] <= 0 and a!=0):
                p2.remove(p2[a])
            if (p1[d][1] <= 0 and d!=0):
                p1.remove(p1[d])

    if (x[0] == 'e'):
        if (now == 1):
            now = 2
        else:
            now = 1
    #print(p1)
    #print(p2)
if (p1[0][1] > 0 and p2[0][1] > 0):
    sys.stdout.write('0' + '\n')
elif (p1[0][1] <= 0 and p2[0][1] > 0):
    sys.stdout.write('-1' + '\n')
elif (p1[0][1] > 0 and p2[0][1] <= 0):
    sys.stdout.write('1' + '\n')
sys.stdout.write(str(p1[0][1]) + '\n')
sys.stdout.write(str(str(len(p1)-1) + ' '))
for i in range(1, len(p1)):
    sys.stdout.write(str(p1[i][1]) + ' ')
sys.stdout.write('\n')
sys.stdout.write(str(p2[0][1]) + '\n')
sys.stdout.write(str(str(len(p2)-1) + ' '))
for i in range(1, len(p2)):
    sys.stdout.write(str(p2[i][1]) + ' ')
sys.stdout.write('\n')
試題編號: 201612-3
試題名稱: 權限查詢
時間限制: 1.0s
內存限制: 256.0MB
問題描述:

問題描述

  授權 (authorization) 是各類業務系統不可缺少的組成部分,系統用戶通過授權機制獲得系統中各個模塊的操作權限。
  本題中的授權機制是這樣設計的:每位用戶具有若干角色,每種角色具有若干權限。例如,用戶 david 具有 manager 角色,manager 角色有 crm:2 權限,則用戶 david 具有 crm:2 權限,也就是 crm 類權限的第 2 等級的權限。
  具體地,用戶名和角色名稱都是由小寫字母組成的字符串,長度不超過 32。權限分爲分等級權限和不分等級權限兩大類。分等級權限由權限類名和權限等級構成,中間用冒號“:”分隔。其中權限類名也是由小寫字母組成的字符串,長度不超過 32。權限等級是一位數字,從 0 到 9,數字越大表示權限等級越高。系統規定如果用戶具有某類某一等級的權限,那麼他也將自動具有該類更低等級的權限。例如在上面的例子中,除 crm:2 外,用戶 david 也具有 crm:1 和 crm:0 權限。不分等級權限在描述權限時只有權限類名,沒有權限等級(也沒有用於分隔的冒號)。
  給出系統中用戶、角色和權限的描述信息,你的程序需要回答多個關於用戶和權限的查詢。查詢可分爲以下幾類:
  * 不分等級權限的查詢:如果權限本身是不分等級的,則查詢時不指定等級,返回是否具有該權限;
  * 分等級權限的帶等級查詢:如果權限本身分等級,查詢也帶等級,則返回是否具有該類的該等級權限;
  * 分等級權限的不帶等級查詢:如果權限本身分等級,查詢不帶等級,則返回具有該類權限的等級;如果不具有該類的任何等級權限,則返回“否”。

輸入格式

  輸入第一行是一個正整數 p,表示不同的權限類別的數量。緊接着的 p 行被稱爲 P 段,每行一個字符串,描述各個權限。對於分等級權限,格式爲 <category>:<level>,其中 <category> 是權限類名,<level> 是該類權限的最高等級。對於不分等級權限,字符串只包含權限類名。
  接下來一行是一個正整數 r,表示不同的角色數量。緊接着的 r 行被稱爲 R 段,每行描述一種角色,格式爲
  <role> <s> <privilege 1> <privilege 2> ... <privilege s>
  其中 <role> 是角色名稱,<s> 表示該角色具有多少種權限。後面 <s> 個字符串描述該角色具有的權限,格式同 P 段。
  接下來一行是一個正整數 u,表示用戶數量。緊接着的 u 行被稱爲 U 段,每行描述一個用戶,格式爲
  <user> <t> <role 1> <role 2> ... <role t>
  其中 <user> 是用戶名,<t> 表示該用戶具有多少種角色。後面 <t> 個字符串描述該用戶具有的角色。
  接下來一行是一個正整數 q,表示權限查詢的數量。緊接着的 q 行被稱爲 Q 段,每行描述一個授權查詢,格式爲 <user> <privilege>,表示查詢用戶 <user> 是否具有 <privilege> 權限。如果查詢的權限是分等級權限,則查詢中的 <privilege> 可指定等級,表示查詢該用戶是否具有該等級的權限;也可以不指定等級,表示查詢該用戶具有該權限的等級。對於不分等級權限,只能查詢該用戶是否具有該權限,查詢中不能指定等級。

輸出格式

  輸出共 q 行,每行爲 false、true,或者一個數字。false 表示相應的用戶不具有相應的權限,true 表示相應的用戶具有相應的權限。對於分等級權限的不帶等級查詢,如果具有權限,則結果是一個數字,表示該用戶具有該權限的(最高)等級。如果用戶不存在,或者查詢的權限沒有定義,則應該返回 false。

樣例輸入

3
crm:2
git:3
game
4
hr 1 crm:2
it 3 crm:1 git:1 game
dev 2 git:3 game
qa 1 git:2
3
alice 1 hr
bob 2 it qa
charlie 1 dev
9
alice game
alice crm:2
alice git:0
bob git
bob poweroff
charlie game
charlie crm
charlie git:3
malice game

樣例輸出

false
true
false
2
false
true
false
true
false

樣例說明

  樣例輸入描述的場景中,各個用戶實際的權限如下:
  * 用戶 alice 具有 crm:2 權限
  * 用戶 bob 具有 crm:1、git:2 和 game 權限
  * 用戶 charlie 具有 git:3 和 game 權限
  * 用戶 malice 未描述,因此不具有任何權限

評測用例規模與約定

  評測用例規模:
  * 1 ≤ pru ≤ 100
  * 1 ≤ q ≤ 10 000
  * 每個用戶具有的角色數不超過 10,每種角色具有的權限種類不超過 10
  約定:
  * 輸入保證合法性,包括:
  1) 角色對應的權限列表(R 段)中的權限都是之前(P 段)出現過的,權限可以重複出現,如果帶等級的權限重複出現,以等級最高的爲準
  2) 用戶對應的角色列表(U 段)中的角色都是之前(R 段)出現過的,如果多個角色都具有某一分等級權限,以等級最高的爲準
  3) 查詢(Q 段)中的用戶名和權限類名不保證在之前(U 段和 P 段)出現過
  * 前 20% 的評測用例只有一種角色
  * 前 50% 的評測用例權限都是不分等級的,查詢也都不帶等級

import sys

line = sys.stdin.readline().strip()
n = int(line)
au=[]
for i in range(0,n):
    tt=sys.stdin.readline().strip()
    au.append(au)
line = sys.stdin.readline().strip()
n = int(line)
xx={}
for i in range(0,n):
    tt=sys.stdin.readline().strip()
    tt=tt.split(' ')
    tt.remove(tt[1])
    bas=[]
    for ii in tt[1:]:
        if(':' in ii):
            ii=ii.split(':')
            gg=int(ii[1])
            if(ii[0] not in bas):
                bas.append(ii[0])
            for j in range(gg,-1,-1):
                add=ii[0]+':'+str(j)
                if(add not in bas):
                    bas.append(add)
        else:
             bas.append(ii)
    xx[tt[0]]=bas
#print(str(xx))
line = sys.stdin.readline().strip()
n = int(line)
user={}
for i in range(0,n):
    tt=sys.stdin.readline().strip()
    tt=tt.split(' ')
    tt.remove(tt[1])
    basic=[]
    for lit in tt[1:]:
        basic.append(xx[lit])
    user[tt[0]]=basic
#print(str(user))
line = sys.stdin.readline().strip()
n = int(line)
for i in range(0,n):
    cc = sys.stdin.readline().strip()
    cc=cc.split(' ')
    if(cc[0] in user):
        o=0
        flag=False
        zz=0
        if(':' in cc[0]):
            for auth in user[cc[0]]:
                if(cc[1] in auth):
                    o+=1
                    if(o>=1):
                        break
        else :
            kk = cc[1] + ':' + str(zz)
            for auth in user[cc[0]]:
                if (kk in auth):
                    flag = True
                    while (kk in auth):
                        kk = cc[1] + ':' + str(zz)
                        zz += 1
                else:
                    if (cc[1] in auth):
                        o += 1
        if(flag):
            sys.stdout.write(str(zz-2)+'\n')
        elif(o>=1):
            sys.stdout.write('true'+'\n')
        else:
            sys.stdout.write('false'+'\n')
    else:
        sys.stdout.write('false'+'\n')
'''
6
crm:2
crm:7
hhhh
jj
ll
git:5
3
rr 3 crm:5 hhhh jj
cc 5 hhhh git:0 ll jj crm:0
qq crm:4 ll
4
a 1 rr 
b 2 cc qq
c 3 qq rr
d 1 cc
'''

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章