水題,這一題上面用棧會比較好
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int MAX = 1000; typedef struct _Node { char name[81]; int weight; }Node; Node data[ MAX ]; int stack[ MAX ]; int stacki; int n; char input[MAX]; int inputi; bool cmp( const Node& left , const Node& right ) { return strcmp( left.name , right.name ) < 0; } int binarysearch( int left , int right , char* key ) { int middle; while( left <= right ) { middle = ( left + right )/2; if( strcmp( data[ middle ].name , key ) == 0 ) return middle; else if( strcmp( data[middle].name , key ) < 0 ) left = middle + 1 ; else right = middle - 1 ; } return -1; } int getnumber() { int result = 0 ; while( input[inputi] >= '0' && input[ inputi ] <= '9' ) { result = result * 10 + input[ inputi ] - '0'; ++inputi; } return result; } int getatom() { char buffer[64]; int k = 0; buffer[k++] = input[inputi++]; while( input[inputi] >= 'a' && input[inputi] <= 'z' ) { buffer[k++] = input[inputi++]; } buffer[k] = '/0'; int mid = binarysearch( 0 , n - 1 , buffer ); if( mid == -1 ) return -1; else return data[mid].weight; } int find() { stacki = 0 ; inputi = 0 ; while( input[inputi] != '/0' ) { if( input[inputi] == '(' ) { stack[ stacki++ ] = -1; inputi++; } else if( input[inputi] == ')' ) { stack[ stacki++ ] = -1; inputi++; } else if( input[inputi] >= 'A' && input[inputi] <= 'Z' ) { stack[ stacki++ ] = getatom(); if( stack[ stacki - 1 ] == -1 ) return -1; } else { int number = getnumber(); if( stack[ stacki - 1 ] != -1 ) stack[ stacki - 1 ] *= number; else { int mid = 0 ; --stacki; while( stack[ stacki - 1 ] != -1 ) mid += stack[ --stacki ]; stack[ stacki - 1 ] = mid * number; } } } int result = 0 ; while( stacki != 0 ) result += stack[--stacki]; return result; } int main() { n = 0 ; while( scanf("%s",data[n].name) , strcmp( data[n].name , "END_OF_FIRST_PART") != 0 ) { scanf("%d",&data[n].weight); ++n; } sort( &data[0] , &data[n] , cmp ); while( scanf("%s",input),strcmp( input , "0") != 0 ) { int result = find(); if( result == -1 ) printf("UNKNOWN/n"); else printf("%d/n",result); } return 0; }
例題: Problem Description 對於包含n(1<=n<=100000)個整數的序列,對於序列中的每一元素,在序列中查找其位置之後第一個大於它的值,如果找到,輸出所找到的值,否則,輸出-1。 Input 輸入有多組,
1. 問題描述: 給你一個由 '('、')' 和小寫字母組成的字符串 s。 你需要從字符串中刪除最少數目的 '(' 或者 ')' (可以刪除任意位置的括號),使得剩下的「括號字符串」有效。 請返回任意一個合法字符串。 有效「括號字符串」應
#1269 : 優化延遲 時間限制:10000ms 單點時限:1000ms 內存限制:256MB 描述 小Ho編寫了一個處理數據包的程序。程序的輸入是一個包含N個數據包的序列。每個數據包根據其重要程度不同,具有不同的"
題目鏈接:1488. 避免洪水氾濫 Your country has an infinite number of lakes. Initially, all the lakes are empty, but when it rai
import java.util.Arrays; //用數組實現棧 public class Stack { private int[] array; private int top; public St
Team Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20
單調棧問題,跟2796差不多。 要注意的是,一次棧掃描就可以決定左右邊界了。 #include <cstdio> using namespace std; const int MAX = 100010; typedef struct _N
單調棧,枚舉每一個點,計算它上面共有多少個1,最後獲取left與right值,計算max值 時間複雜度爲O( n ),只是代碼打得不好,時間比較慢,仍然AC 本題主要考察對搜索的理解,是應該枚舉點,還是枚舉邊 #include <cstd
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32845 Accepted: 11409 Description
【問題描述】 設停車場是一個可停放n輛汽車的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內按車輛到達時間的先後順序,依次由北向南排列(大門在最南端,最先到達的第一輛車放在車場的最北端),若車場內已停滿n輛汽車,則後來的汽車只
1289 大魚喫小魚 題目來源: Codility 基準時間限制:1 秒 空間限制:131072 KB 分值: 5 難度:1級算法題 收藏 關注 有N條魚每條魚的位置及大小均不同,他們沿着X軸遊動,有的向
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 55797 Accepted: 16048 Case Time Lim
文章目錄1. 相關結構體定義1.1 順序棧1.2 鏈棧結點定義1.3 順序隊列1.4 鏈隊定義2. 順序棧相關操作3. 鏈棧相關操作4. 順序棧的應用5. 順序隊5.1 循環隊列5.2 鏈隊 1. 相關結構體定義 1.1 順序棧
【題目】 給定數組arr和整數num,共返回有多少個子數組滿足如下情況: max(arr[i…j]) - max(arr[i…j]) <= num max(arr[i…j])表示子數組arr[i…j]中的最大值,
題目鏈接:394. 字符串解碼 Given an encoded string, return its decoded string. The encoding rule is: k[encoded_string], where