1. 程式人生 > 實用技巧 >Orz 教主的比賽題解

Orz 教主的比賽題解

洛谷AC通道!

T1 字串還原:

直接暴力模擬所有情況即可。

同時,考慮一個十分方便的函式:reverse 函式。 可以直接將字串全部翻轉

用法:

string s;
reserve(s.begin(), s.end());

那麼,如何判斷該組資料合法?

不難發現,除開翻轉的那個串,剩下的兩個串,一個加$k$,一個減$k$, 如果我們把他們相加起來呢? 正好就是原字母的兩倍。那麼,利用這個性質,再和被翻轉過的那個串的原串進行對比,就可以判斷出這種情況是否合法了。

程式碼: (總共分三種情況)

#include <bits/stdc++.h>
using namespace
std; int n; bool judge(string s1, string s2, string s3){ int len = s1.length(); bool flag = 1; reverse(s1.begin(), s1.end()); for(int i = 0; i < n; i++){ if((((int)s2[i] - 'a' + s3[i] - 'a') - 2 * (s1[i] - 'a')) % 26 != 0){ flag = 0; break; } }
return flag; } int main(){ string s1, s2, s3; cin >> n; cin >> s1 >> s2 >> s3; if(judge(s1, s2, s3)) reverse(s1.begin(), s1.end()), cout << s1 << endl; else if(judge(s2, s1, s3)) reverse(s2.begin(), s2.end()), cout << s2 << endl;
else if(judge(s3, s2, s1)) reverse(s3.begin(), s3.end()), cout << s3 << endl; return 0; }

T2: 包裹快遞

題目中有這樣一句話: 最大的xx最小。

思路秒出: 二分答案。

1、我們二分什麼? 當然是二分速度啦。

2、如何判斷當前二分的速度是否合法? 當然是一直利用這個最大速度跑路啦!如果最大速度跑路,還會出現不能及時到達的情況,肯定是不合法的,需要增大速度。反之,我們要降低速度。

3、精度問題:毒瘤資料卡$double$精度,我們要開$long double$,而且二分判斷退出時必須要有夠大的小精度,比如$1e-6$ ~ $1e-7$左右。太高了又會超時。

#include <bits/stdc++.h>
using namespace std;
#define N 1000010
const long double inf = 1e7;
const long double eof = 1e-7;

template <class T>
inline void read(T& a){
    T x = 0, s = 1;
    char c = getchar();
    while(!isdigit(c)){
        if(c == '-') s = -1;
        c = getchar();
    }
    while(isdigit(c)){
        x = x * 10 + (c ^ '0');
        c = getchar();
    }
    a = x * s;
    return ;
}

int n; 
long double in[N], end[N], s[N];

bool check(long double speed){
    long double t = 0;
    for(int i = 1; i <= n; i++){
        t += (long double)s[i] * 1.0 / speed;
        if(t < in[i]) t = in[i];
        else if(t > end[i])
            return 0; 
    }
    return 1;
}

int main(){
    read(n);
    for(int i = 1; i <= n; i++){
        cin >> in[i] >> end[i] >> s[i];
    }
    long double l = 0.0, r = inf;
    while(r - l > eof){
        long double mid = (l + r) / 2.00;
        if(check(mid)) r = mid;
        else l = mid;
    }
    printf("%.2Lf", l);
    return 0;
}