#UVa:10340-All in All

利用兩個變數i,sindex,i從t開始搜,搜到與s[sindex]一樣就讓sindex++,這樣到最後如果sindex與s字串的長度一樣,即表示答案是Yes,反之則是No。

C++(0.016)

/*******************************************************/
/* UVa 10340 All in All                                */
/* Author: LanyiKnight [at] knightzone.org             */
/* Version: 2011/12/05                                 */
/*******************************************************/
#include<iostream>
#include<cstdio>
using namespace std;

int main(){
  string s, t;
  while( cin >> s >> t ){
    int sindex = 0;
    for( int i = 0 ; i < t.length() ; i++ ){
      if( t[i] == s[sindex] ){
        sindex++;
        if( sindex == s.length() ) break;
      }
    }
    if( sindex == s.length() )
      printf( "Yes\n" );
    else
      printf( "No\n" );
  }
  return 0;
}

#UVa:10300-Ecological Premium

只要把所有農夫各自的農場面積和環境等級相乘之後再求總和即是解答。

C++(0.008)

/*******************************************************/
/* UVa 10300 Ecological Premium                        */
/* Author: LanyiKnight [at] knightzone.org             */
/* Version: 2011/12/04                                 */
/*******************************************************/
#include<iostream>
#include<cstdio>
using namespace std;

int main(){
  int n, f, area, animal, eco, money;
  while( scanf( "%d", &n ) != EOF ){
    for( int i = 0 ; i < n ; i++ ){
      money = 0;
      scanf( "%d", &f );
      for( int j = 0 ; j < f ; j++ ){
        scanf( "%d%d%d", &area, &animal, &eco );
        money += area * eco;
      }
      printf( "%d\n", money );
    }
  }
  return 0;
}

#UVa:10222-Decode the Mad man

先把鍵盤輸入成一個字元陣列,這樣比較好轉換。

C++(0.016)

/*******************************************************/
/* UVa 10222 Decode the Mad man                        */
/* Author: LanyiKnight [at] knightzone.org             */
/* Version: 2011/12/01                                 */
/*******************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main(){
  const char keyboard[] = "`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./";
  const int kblength = strlen( keyboard );
  string s;

  while( getline( cin, s ) ){
    for( int i = 0 ; i < s.length() ; i++ )
      if( s[i] == ' ' )
        printf( " " );
      else
        for( int j = 0 ; j < kblength ; j++ )
          if( keyboard[j] == s[i] ){
            printf( "%c", keyboard[j-2] );
            break;
          }
    printf( "\n" );
  }
  return 0;
}

#UVa:10209-Is This Integration ?

要算面積,令邊長為a,一塊斜線的面積為x,一塊點狀的面積為y,一塊格子狀的面積為z。

則首先正方形的面積減去四分之一以a為半徑的圓的面積 = a*a – a*a*π/4 = y+2*z ->(1)

再來六分之一以a為半徑的圓的面積減去以a為邊長的正三角形(想想看在哪裡…) = a*a*π/6 – a*a*sqrt(3.0)/4 = 假設為某個面積w(想想看在哪裡…) ->(2)

接著把四分之一以a為半徑的圓的面積減去六分之一以a為半徑的圓的面積 = a*a*π/4 – a*a*π/6 = y+z+w ->(3)

則z=(y+2*z)-(y+z+w)+w=(1)-(3)+(2)就出來了,那麼y=(y+2*z)-(2*z)=(1)-2*z也出來了,而x=a*a-4*y-4*z也跟著出來了!

C++(0.044)

/*******************************************************/
/* UVa 10209 Is This Integration?                      */
/* Author: LanyiKnight [at] knightzone.org             */
/* Version: 2011/12/01                                 */
/*******************************************************/
#include<iostream>
#include<cstdio>
#include<cmath>
#define PI (2.0*acos(0.0))
using namespace std;

int main(){
  double a;
  while( scanf( "%lf", &a ) != EOF ){
    double x, y, z;
    z = a*a - a*a*PI/4.0;
    z -= a*a*PI/4.0 - a*a*PI/6.0 - ( a*a*PI/6.0 - a*a*sqrt(3.0)/4.0 );
    y = a*a - a*a*PI/4.0 - 2.0*z;
    x = a*a - 4.0*y - 4.0*z;
    printf( "%.3lf %.3lf %.3lf\n", x, 4*y, 4*z );
  }
  return 0;
}

#UVa:10141-Request for Proposal

照著題目要求的做即可。

P.S. 所有名稱都有可能中間有空白。

C++(0.012)

/*******************************************************/
/* UVa 10141 Request for Proposal                      */
/* Author: LanyiKnight [at] knightzone.org             */
/* Version: 2011/11/30                                 */
/*******************************************************/
#include<iostream>
#include<cstdio>
using namespace std;

struct Factory{
  string name;
  float d;
  int r;
};

int main(){
  int n, p;
  int RFP = 0;
  string requirement;
  Factory fac, best; 
  while( scanf( "%d%d", &n, &p ) != EOF && ( n || p ) ){
    if( RFP ) printf( "\n" );
    getchar(); /* delete the enter key */
    for( int i = 0 ; i < n ; i++ )
      getline( cin, requirement );

    best.r = 0;
    for( int i = 0 ; i < p ; i++ ){
      getline( cin, fac.name );
      scanf( "%f%d", &(fac.d), &(fac.r) );
      getchar(); /* delete the enter key */
      for( int j = 0 ; j < fac.r ; j++ )
        getline( cin, requirement );
      if( best.r < fac.r )
        best = fac;
      else if( best.r == fac.r && best.d > fac.d )
        best = fac;
    }
    printf( "RFP #%d\n%s\n", ++RFP, best.name.c_str() );
  }
  return 0;
}

#UVa:10107-What is the Median?

數值一直由小到大插入陣列中,即可得其中位數。

C++(0.040)

/*******************************************************/
/* UVa 10107 What is the Median?                       */
/* Author: LanyiKnight [at] knightzone.org             */
/* Version: 2011/11/30                                 */
/*******************************************************/
#include<iostream>
#include<cstdio>
using namespace std;

int main(){
  int N[10005], top = 0, temp;
  while( scanf( "%d", &N[top++] ) != EOF ){
    for( int i = 0 ; i < top ; i++ )
      if( N[top-1] > N[i] ){
        temp = N[top-1];
        for( int j = top-1 ; j > i ; j-- )
          N[j] = N[j-1];
        N[i] = temp;
        break;
      }
      if( top % 2 )
        printf( "%d\n", N[top/2] );
      else
        printf( "%d\n", (N[top/2]+N[top/2-1])/2 );
  }
  return 0;
}

#UVa:10082-WERTYU

先把鍵盤打成一個陣列,這樣比較好得解。

C++(0.012)

/*******************************************************/
/* UVa 10082 WERTYU                                    */
/* Author: LanyiKnight [at] knightzone.org             */
/* Version: 2018/06/02                                 */
/*******************************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main(){
  const char keyboard[] = " `1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
  const int kblen = strlen(keyboard);
  char hash[256];
  string s;

  for(int i = 0 ; i < 256 ; ++i){
    hash[i] = i;
  }

  for( int i = 2 ; i < kblen ; ++i ){
    hash[keyboard[i]] = keyboard[i-1];
  }

  while(getline(cin, s)){
    for(int i = 0 ; i < s.length() ; i++){
      printf( "%c", hash[s[i]] );
    }
    printf( "\n" );
  }

  return 0;
}

#UVa:10071-Back to High School Physics

這題只要套公式即可得解。

P.S. 因為是一等速度運動,所以位移的公式就是 平均速度 * 經過的時間,而因為正好是要兩倍時間後的位移,所以此時的速度即為平均速度,再乘上2倍時間即得解。

C++(0.036)

/*******************************************************/
/* UVa 10071 Back to High School Physics               */
/* Author: LanyiKnight [at] knightzone.org             */
/* Version: 2011/11/29                                 */
/*******************************************************/
#include<iostream>
#include<cstdio>
using namespace std;

int main(){
  int v, t;
  while( scanf( "%d%d", &v, &t ) != EOF ){
    printf( "%d\n", 2*v*t );
  }
  return 0;
}

#UVa:10062-Tell me the frequencies!

這題的話,我是先一個一個字看它的ASCII碼是多少,把陣列中它的ASCII碼那格加1,表示這個字多出現了一次。

我用了三個變數,一個存最大出現的ASCII碼,一個存最小出現的ASCII碼,一個存最多出現的次數。

然後我就從出現一次開始搜尋,直到最多出現的次數,每次搜尋都是從最大ASCII碼搜尋到最小ASCII碼這樣,搜尋到次數一樣就輸出。

(當然這題用Sort也是OK啦XD)

C++(0.036)

/*******************************************************/
/* UVa 10062 Tell me the frequencies!                  */
/* Author: LanyiKnight [at] knightzone.org             */
/* Version: 2011/11/29                                 */
/*******************************************************/
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

int main(){
  string s;
  int min_ASCII, max_ASCII, max_count;
  bool blankline = 0;
  while( getline( cin , s ) ){
    if( blankline ) printf( "\n" );

    int ASCII[130] = {0};
    min_ASCII = 200;
    max_ASCII = 0;
    max_count = 0;

    for( int i = 0 ; i < s.length() ; i++ ){
      ASCII[(int)s[i]]++;
      min_ASCII = min( min_ASCII, (int)s[i] );
      max_ASCII = max( max_ASCII, (int)s[i] );
      max_count = max( max_count, ASCII[(int)s[i]] );
    }

    for( int i = 1 ; i <= max_count ; i++ )
      for( int j = max_ASCII ; j >= min_ASCII ; j-- )
        if( ASCII[j] == i )
          printf( "%d %d\n", j, i );
        blankline = 1;
  }
  return 0;
}

#UVa:10055-Hashmat the Brave Warrior

這題只要將兩個數絕對值相減即可,唯一的陷阱就是在於數值範圍,剛好到2^32,就連unsigned int也會爆,所以請用long long吧!

C++(0.136)

/*******************************************************/
/* UVa 10055 Hashmat the brave warrior                 */
/* Author: LanyiKnight [at] knightzone.org             */
/* Version: 2011/11/29                                 */
/*******************************************************/
#include<iostream>
#include<cstdio>
using namespace std;

int main(){
  long long warrior1, warrior2;
  while( scanf( "%lld%lld", &warrior1, &warrior2 ) != EOF ){
    printf( "%lld\n", (warrior1 > warrior2)? warrior1-warrior2 : warrior2-warrior1 ); 
  }
  return 0;
}
共 37 頁 1 33 34 35 36 37