CodeForces #41 Div2

最初鯖落ちしててはんぱなかった。ていうか2問しか解けなかったヤバイ。Eは解けそうで解けなかった。Dに至っては見てない。

A

文字列a,bが入力され、bがaの反転文字列になっているか判定。

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
	string a,b;
	cin >> a >> b;
	reverse(b.begin(),b.end());
	cout << (a==b?"YES":"NO") << endl;
}

B

なんか日によって為替レートが違う。それで儲けたい。"一回のみ売買できる。"(いつ買っていつ売ればいいか。)。最大で儲けれる額を出力せよ。

一回のみしか売買出来ないこと知らなくて、これで通したら、pretest通ったのにWA出た。

int main(){
	int n,b;
	cin >> n >> b;
	vector<int> data(n);
	rep(i,n){
		cin >> data[i];
	}
	int now = b;
	rep(i,n-1){
		if( data[i] < data[i+1]){
			now = (now / data[i])*data[i+1] + (now % data[i]);
		}
	}
	cout << now << endl;
}

プラクティス

int main(){
	int n,b;
	cin >> n >> b;
	vector<int> data(n);
	rep(i,n)cin >> data[i];

	
	int ret = b;
	
	rep(i,n){
		for(int j=i+1;j<n;j++){
			ret = max(ret, (b / data[i])*data[j] + (b % data[i]) );
		}
	}
	cout << ret << endl;
}

C

両端に記号使えない。atは一回。dotは何度でも。辞書順で最小のものを返せ。

.の方が小さいとか考えてたけど全く無意味だった。一応通った。

int main(){
	string s;
	cin >> s;
	
	int f = 0;

	while(~s.find("dot")){
		int pos = s.find("dot");
		s.replace(pos,3,".");
	}
	if(s[0] == '.')s.replace(0,1,"dot");
	if(s[s.length()-1] == '.')s.replace(s.length()-1,1,"dot");
	
	vector<int> at;
	
	f = 0;
	
	int pos;
	while(pos = s.find("at",f), ~pos ){
		at.push_back(pos);
		f = pos+1;
	}
	string ret = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
	rep(i,at.size()){
		string t = s;
		t.replace(at[i],2,"@");
		if(t[0] == '@' || t[t.length()-1] == '@')continue;
		ret = min(ret,t);
	}
	cout << ret << endl;	
}

D

見てない。

E

解けそうで解けなかったうーん。机上計算が誤っていたことに気づかずWA出しまくった。