2017计蒜客比赛第二场A题B题

来源:互联网 发布:linux awk 编辑:程序博客网 时间:2024/05/22 06:35

A题 https://nanti.jisuanke.com/t/15503 

思路:模拟打麻将,抓拍顺抓倒着数丢色子

AC代码

#include <iostream>#include <cstring>#include <cstdio>#include <vector>#include <queue>#include <map>#include <stack>#include <algorithm>using namespace std;const int max_n =  100005;int num1,num2,num3,num4;int k,d;vector<pair<int,int> >v;bool judge(int x,int y) {    int sum = num1+num2+num3+num4;    int t = min(x,y)+1;    int g = x+y;    g %= 4;    int j = 0;    if(g == 0) {        j = num1;    } else if(g == 3) {        j = num1+num4;    } else if(g == 2) {        j = num1+num4+num3;    }    j = (j+t-1)%sum;    int fg = 0;    int flag = 0;    int wan = 1;    int cnt = 0;    for(int kk = j; kk < sum && cnt < 24; kk++) {        fg++;        cnt++;        if(wan == 1 && (v[kk].first == k &&(v[kk].second == d||v[kk].second == d+1))) {            flag++;        }        if(fg%2 == 0) {            wan++;            wan %= 4;        }    }    for(int kk = 0; kk < j && cnt < 24; ++kk) {        fg++;        cnt++;        if(wan == 1 && (v[kk].first == k &&(v[kk].second == d||v[kk].second == d+1))) {            flag++;        }        if(fg%2 == 0) {            wan++;            wan %= 4;        }    }    if(flag == 2) {        return true;    }    return false;}int main() {    cin >> num1 >> num2 >> num3 >> num4;    cin >> k >> d;    k %= 4;    for(int i = 1; i <= num1; i++) {        v.push_back(pair<int,int>(1,i));    }    for(int i = 1; i <= num4; i++) {        v.push_back(pair<int,int>(0,i));    }    for(int i = 1; i <= num3; i++) {        v.push_back(pair<int,int>(3,i));    }    for(int i = 1; i <= num2; i++) {        v.push_back(pair<int,int>(2,i));    }    int ans = 0;    bool used[10][10];    memset(used,0,sizeof(used));    for(int i = 1; i < 7; i++) {        for(int j = 1; j < 7; j++) {            if(judge(i,j) && !used[i][j]) {                //cout << i << " " << j <<endl;                used[i][j] = 1;                used[j][i] = 1;                ans++;            }        }    }    cout << ans<<endl;    return 0;}
我自己写的真的很烦

B题 https://nanti.jisuanke.com/t/15504 

简单版本表达式求值,利用栈模拟,打一份以前写过的表达式求值就可以了,表达式求值写起来很麻烦,所以用Python

n = input()a = input()b = eval(a)if type(b) == int:print(b)else:print("%.6f"%b)

C++代码,由于自己写的栈的模拟错了,所以引用了这位巨巨的博客代码 http://blog.csdn.net/flyfy1/article/details/5309551 然后修改了一下就可以了

#include <iostream>#include <string>#include <stack>#include <fstream>using namespace std;bool isone(char c) {    return (c=='+' || c=='-');}bool istwo(char c) {    return (c=='*' || c=='/');}string shorten(string m) {    stack<char> s;    string sur;    int i;    char w;    for(i=0; i<m.size(); i++) {        if(isdigit(m[i]) || m[i]=='.') {            while(isdigit(m[i]) || m[i]=='.')   sur += m[i++];            i--;            sur += '$';        } else if(isone(m[i])) {            while(s.size() && (isone(s.top()) || istwo(s.top()))) {                sur+=s.top();                s.pop();            }            s.push(m[i]);        } else if(m[i]==')') {            while(s.top()!='(') {                sur+=s.top();                s.pop();            }            s.pop();        } else if(istwo(m[i])) {            while(s.size() &&  istwo(s.top())) {                sur+=s.top();                s.pop();            }            s.push(m[i]);        } else s.push(m[i]);    }    while(s.size()) {        sur+=s.top();        s.pop();    }    return sur;}double tentimes(int n) {    double res=1;    for(int i=0; i<n; i++) {        res *= 10;    }    return res;}double str2double(string s) {    double res=0;    char c;    int dec=0;    for(int i=1; i<=s.size(); i++) {        c=s[i-1];        if(c=='.') dec=i;        else if(!dec) res = res*10 + c-'0';        else res += (c-'0')/tentimes(i-dec);    }    return res;}double calculate(string s) {    double res, t;    stack<double> num;    string temp;    int i;    for(i=0; i<s.size(); i++) {        temp="";        if(isdigit(s[i]) || s[i]=='.') {            while(isdigit(s[i]) || s[i]=='.') temp+=s[i++]; //如果最后一位是数字,这样做会出错            num.push(str2double(temp));        } else {            switch (s[i]) {            case '+':                t=num.top();                num.pop();                t+=num.top();                num.pop();                num.push(t);                break;            case '-':                t=num.top();                num.pop();                t=num.top()-t;                num.pop();                num.push(t);                break;            case '*':                t=num.top();                num.pop();                t*=num.top();                num.pop();                num.push(t);                break;            case '/':                t=num.top();                num.pop();                t=num.top()/t;                num.pop();                num.push(t);                break;            }        }    }    res=num.top();    return res;}int main() {    int n;    cin >> n;    string s;    for(int i = 0;i < n++;i){        cin >> s;    }    string mid, sur;    cin >> mid;    int flag = 0;    for(int i = 0; i < mid.length(); ++i) {        if(mid[i] == '.' || mid[i] == '/') {            flag = 1;        }    }    sur = shorten(mid);    if(flag) {        printf("%.6f\n",calculate(sur));    } else        printf("%.0f\n",calculate(sur));    return 0;}



原创粉丝点击