ccfcsp-202309(1、2、3)

202309-1 坐标变换(其一)

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n, m;
    cin >> n >> m;
    int x, y;
    int opx = 0, opy = 0;
    for(int i = 0; i < n; i++){
        cin >> x >> y;
        opx += x;
        opy += y;
    }
    for(int i = 0; i < m; i++){
        cin >> x >> y;
        cout << x + opx << " " << y + opy << endl;
    }
    return 0;
}

202309-2 坐标变换(其二)

80分超时解

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n, m;
    cin >> n >> m;
    vector<vector<double>> operation(n, vector<double>(2));
    double x, y;
    for(int i = 0; i < n; i++){
        cin >> operation[i][0] >> operation[i][1];
    }
    int i, j;
    for(int t = 0; t < m; t++){
        cin >> i >> j >> x >> y;
        double xx = x, yy = y;
        double angle = 0, k = 1;
        i--;
        for(;i < j; i++){
            if(operation[i][0] == 1){
                k *= operation[i][1];
            }else if(operation[i][0] == 2){
                angle += operation[i][1];
            }
        }
        if(k != 1){
            x *= k;
            y *= k;
        }
        if(angle != 0){
            xx = x * cos(angle) - y * sin(angle);
            yy = x * sin(angle) + y * cos(angle);
            cout << fixed << setprecision(3) << xx << " " << yy << endl;
        }else{
            cout << fixed << setprecision(3) << x << " " << y << endl;
        }
    }
    return 0;
}

100分解

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n, m;
    cin >> n >> m;
    vector<double> A(n + 1, 1);//拉伸k倍
    vector<double> B(n + 1, 0);//旋转角度
    double x, y;
    for(int i = 1; i <= n; i++){
        int a; double b;
        cin >> a >> b;
        if(a == 1){
            A[i] = b*A[i - 1];
            B[i] = B[i - 1];
        }else{
            A[i] = A[i - 1];
            B[i] = b + B[i - 1];
        }
    }
    int i, j;
    for(int t = 0; t < m; t++){
        cin >> i >> j >> x >> y;
        double xx = x, yy = y;
        double k = A[j]/A[i - 1], angle = B[j] - B[i - 1];
        if(k != 1){
            x *= k;
            y *= k;
        }
        if(angle != 0){
            xx = x * cos(angle) - y * sin(angle);
            yy = x * sin(angle) + y * cos(angle);
            cout << fixed << setprecision(3) << xx << " " << yy << endl;
        }else{
            cout << fixed << setprecision(3) << x << " " << y << endl;
        }
    }

    return 0;
}

202309-3 梯度求解

cpp 复制代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 1e9 + 7;

int main() {
    vector<string> vec;
    stack<map<ll, ll>> st;
    int n, m, k;
    cin >> n >> m;
    string str, s;
    vector<int> a(n + 1, 0);//变量的值

    getchar();
    getline(cin, str);
    std::stringstream ss(str);
    while(ss >> s){
        vec.push_back(s);
    }
    while(m--){
        cin >> k;
        str = "x" + to_string(k);//求导变量
        for(int i = 1; i <= n; i++)
            cin >> a[i];
        for(int i = 0; i < vec.size(); i++){
            s = vec[i];
            map<ll, ll> mp;
            if(s == str){ //是求导变量
                mp[1] = 1;
                st.push(mp);
            }else if(s[0] == 'x'){ //是其他变量
                int d = stoi(s.substr(1));
                mp[0] = a[d] % mod;
                st.push(mp);
            }else if(s == "+" || s == "-" || s == "*"){//是运算符
                map<ll,ll> mp2 = st.top();
                st.pop();
                map<ll,ll> mp1 = st.top();
                st.pop();

                if(s == "+"){
                    mp = mp1;
                    for(auto it : mp2){
                        mp[it.first] = (mp[it.first] + it.second) % mod;
                    }
                }else if(s == "-"){
                    mp = mp1;
                    for(auto it : mp2){
                        mp[it.first] = (mp[it.first] - it.second) % mod;
                    }
                }else{
                    for(auto it1 : mp1){
                        for(auto it2 : mp2){
                            mp[it1.first + it2.first] += it1.second * it2.second;
                            mp[it1.first + it2.first] %= mod;
                        }
                    }
                }
                mp1.clear();
                mp2.clear();
                st.push(mp);
            }else{ //是数字
                ll d = stoll(s);
                mp[0] = d % mod;
                st.push(mp);
            }
        }
        map<ll,ll> mp = st.top(); //获得结果的一元表达式
        st.pop();
        ll ans = 0;
        for(auto it : mp){
            ll e = it.first, c = it.second;
            if(e > 0){
                ans = ans + c * e * pow(a[k], e - 1);
                ans %= mod;
            }
        }
        cout << (ans + mod) % mod << endl;
        mp.clear();
    }
    return 0;
}
相关推荐
MZ_ZXD0011 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
A星空1232 小时前
一、Linux嵌入式的I2C驱动开发
linux·c++·驱动开发·i2c
凡人叶枫2 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
会叫的恐龙2 小时前
C++ 核心知识点汇总(第六日)(字符串)
c++·算法·字符串
小糯米6013 小时前
C++顺序表和vector
开发语言·c++·算法
独望漫天星辰3 小时前
C++ 多态深度解析:从语法规则到底层实现(附实战验证代码)
开发语言·c++
王老师青少年编程4 小时前
2024年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)
c++·题解·真题·csp·信奥赛·csp-s·提高组
凡人叶枫4 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
CSDN_RTKLIB4 小时前
使用三方库头文件未使用导出符号情景
c++
rainbow68895 小时前
Linux文件描述符与重定向原理
c++