Codeforces Round #667 (Div. 3) 题解

好久没刷codeforces了,真菜

A 水题

#include<bits/stdc++.h>
#define rep(i, n) for(int i=0;i!=n;++i)
#define per(i, n) for(int i=n-1;i>=0;--i)
#define Rep(i, sta, n) for(int i=sta;i!=n;++i)
#define rep1(i, n) for(int i=1;i<=n;++i)
#define per1(i, n) for(int i=n;i>=1;--i)
#define Rep1(i, sta, n) for(int i=sta;i<=n;++i)
#define L rt<<1
#define R rt<<1|1
#define inf (0x3f3f3f3f)
#define llinf (1e18)
#define ALL(A) A.begin(),A.end()
#define SIZE(A) ((int)A.size())
#define MOD (1e9 + 7)
#define PII pair<int,int>
typedef long long i64;
using namespace std;
int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int t;  cin >> t;
    i64 a,b;
    while(t--){
        cin >> a >> b;
        i64 dif = abs(a - b),ans = 0;
        if(dif % 10)
            ans = 1;
        ans += dif / 10;
        cout << ans << endl; 
    }
    return 0;
}

  

B 注意下 :俩个数和相同的情况下,差值越大乘积越小,因此贪心比较就好了

#include<bits/stdc++.h>
#define rep(i, n) for(int i=0;i!=n;++i)
#define per(i, n) for(int i=n-1;i>=0;--i)
#define Rep(i, sta, n) for(int i=sta;i!=n;++i)
#define rep1(i, n) for(int i=1;i<=n;++i)
#define per1(i, n) for(int i=n;i>=1;--i)
#define Rep1(i, sta, n) for(int i=sta;i<=n;++i)
#define L rt<<1
#define R rt<<1|1
#define inf (0x3f3f3f3f)
#define llinf (1e18)
#define ALL(A) A.begin(),A.end()
#define SIZE(A) ((int)A.size())
#define MOD (1e9 + 7)
#define PII pair<int,int>
typedef long long i64;
using namespace std;
i64 s(i64 a, i64 b, i64 x, i64 y, i64 n) {
	i64 t=min(a-x, n);
	a-=t;
	n-=t;
	t=min(b-y, n);
	b-=t;
	return a*b;
}
void solve() {
	i64 a, b, x, y, n;
    cin >> a >> b >> x >> y >> n;
	cout << (min(s(a, b, x, y, n), s(b, a, y, x, n))) << endl;
}
int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int t;  cin >> t;
    while(t--){
        solve();
    }   
    return 0;
}

C 贪心

#include<bits/stdc++.h>
#define rep(i, n) for(int i=0;i!=n;++i)
#define per(i, n) for(int i=n-1;i>=0;--i)
#define Rep(i, sta, n) for(int i=sta;i!=n;++i)
#define rep1(i, n) for(int i=1;i<=n;++i)
#define per1(i, n) for(int i=n;i>=1;--i)
#define Rep1(i, sta, n) for(int i=sta;i<=n;++i)
#define L rt<<1
#define R rt<<1|1
#define inf (0x3f3f3f3f)
#define llinf (1e18)
#define ALL(A) A.begin(),A.end()
#define SIZE(A) ((int)A.size())
#define MOD (1e9 + 7)
#define PII pair<int,int>
typedef long long i64;
using namespace std;
int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int t,n,x,y;  cin >> t;
    while(t--){
        cin >> n >> x >> y;//n - 1间隔
        vector<int> vec;
        int dif  = y - x,dic,step;
        for(dic = n-1;;--dic)//划分 n - 1,不满足
            if(dif % dic == 0){
                step = dif / dic;
                break;
            }
        for(int i=x;i<=y;i+=step)
            vec.push_back(i);
        for(int i=x-step;i>0;i-=step){
            if(vec.size() == n)
                break;
            vec.push_back(i);
        }
        for(int i=y+step;;i+=step){
            if(vec.size() == n)
                break;
            vec.push_back(i);
        }
        for(auto &val:vec)
            cout << val << " ";
        cout << endl;
    }    
    return 0;
}
View Code

D 模拟题

#include<bits/stdc++.h>
#define rep(i, n) for(int i=0;i!=n;++i)
#define per(i, n) for(int i=n-1;i>=0;--i)
#define Rep(i, sta, n) for(int i=sta;i!=n;++i)
#define rep1(i, n) for(int i=1;i<=n;++i)
#define per1(i, n) for(int i=n;i>=1;--i)
#define Rep1(i, sta, n) for(int i=sta;i<=n;++i)
#define L rt<<1
#define R rt<<1|1
#define inf (0x3f3f3f3f)
#define llinf (1e18)
#define ALL(A) A.begin(),A.end()
#define SIZE(A) ((int)A.size())
#define MOD (1e9 + 7)
#define PII pair<int,int>
typedef long long i64;
using namespace std;
i64 to_10(int n){
    i64 num = 1;
    rep(i,n)
        num *= 10;
    return num;
}
int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int t,s,cnt,pos;  cin >> t;//cnt 代表之前的数字和
    string str;
    while(t--){
        cin >> str >> s;
        i64 ans = 0;
        cnt = 0, pos = 0;
        rep(i,SIZE(str)){
            if(cnt + (str[i] - '0') <= s){
                ++pos;
                cnt += (str[i] - '0');
            }else
                break;
        }
        if(pos == SIZE(str)){
            cout << 0 << endl;
            continue;
        }
        int len = str.substr(pos).size();
        i64 num = atoll(str.substr(pos).c_str());
        ans += to_10(len) - num;
        if(cnt == s){
            Rep(i, pos, SIZE(str))
                str[i] = '0';
            if(str[pos-1] != '9'){
                int index = pos - 1 -1;
                per(i,pos)
                    if(str[i] == '0')
                        --index;
                    else
                        break;
                ++str[pos-1];//进位加上
                if(index == -1)
                    ans += to_10(SIZE(str)) - atoll(str.c_str());
                else
                    ans += to_10(SIZE(str) -  index - 1) - atoll(str.substr(index+1).c_str());
            }
        }
        cout << ans << endl;
    }
    return 0;
}
View Code

E :点的坐标与y坐标无关,因此可以将所有的x点的坐标排序,枚举二分可以找到从每个小球开始的可以包含小球个数,但是第二块木板可以从后面的任何位置开始,因此需要存储后面的最大值

#include<bits/stdc++.h>
#define rep(i, n) for(int i=0;i!=n;++i)
#define per(i, n) for(int i=n-1;i>=0;--i)
#define Rep(i, sta, n) for(int i=sta;i!=n;++i)
#define rep1(i, n) for(int i=1;i<=n;++i)
#define per1(i, n) for(int i=n;i>=1;--i)
#define Rep1(i, sta, n) for(int i=sta;i<=n;++i)
#define L rt<<1
#define R rt<<1|1
#define inf (0x3f3f3f3f)
#define llinf (1e18)
#define ALL(A) A.begin(),A.end()
#define SIZE(A) ((int)A.size())
#define MOD (1e9 + 7)
#define PII pair<int,int>
typedef long long i64;
using namespace std;
int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int t,n,k;  cin >> t;
    while(t--){
        cin >> n >> k;
        vector<int> x(n),y(n),dp(n+1,0);
        for(auto &val:x)
            cin >> val;
        for(auto &val:y)
            cin >> val;
        sort(x.begin(),x.end());
        per(i, n){
            int nowx = x[i] +k;
            int index = upper_bound(x.begin(),x.end(),nowx) - x.begin();
            dp[i] = max(dp[i+1], index - i);  
        }
        int ans = 0;
        rep(i, n){
            int nowx = x[i] + k;
            int index = upper_bound(x.begin(),x.end(),nowx) - x.begin();
            ans = max(ans, index - i + dp[index]);
        }
        cout << ans << endl;
    }
    return 0;
}

F: 统计个数,由题可知 个数为 每个t[1]字符的t[0]字符的和,可以改变任意字符,因此考虐从头到尾进行dp,因为只有前面状态确定了才可以进行统计

一共存在三种状态

s[i] 不发生变化

当 发生变化的次数小于k:

s[i] -> t[0]

s[i] -> t[1]

具体见代码

#include<bits/stdc++.h>
#define rep(i, n) for(int i=0;i!=n;++i)
#define per(i, n) for(int i=n-1;i>=0;--i)
#define Rep(i, sta, n) for(int i=sta;i!=n;++i)
#define rep1(i, n) for(int i=1;i<=n;++i)
#define per1(i, n) for(int i=n;i>=1;--i)
#define Rep1(i, sta, n) for(int i=sta;i<=n;++i)
#define L rt<<1
#define R rt<<1|1
#define inf (0x3f3f3f3f)
#define llinf (1e18)
#define ALL(A) A.begin(),A.end()
#define SIZE(A) ((int)A.size())
#define MOD (1e9 + 7)
#define PII pair<int,int>
typedef long long i64;
using namespace std;
const int maxn = 256;
int dp[maxn][maxn][maxn];
int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n,k;    string s,t;
    while(cin >> n >> k >> s >> t){
        memset(dp,-1,sizeof(dp));
        dp[0][0][0] = 0;
        for(int i=0;i!=n;++i){
            for(int j=0;j<=k;++j){
                for(int cnt0 = 0;cnt0 <= n;++cnt0){
                    if(dp[i][j][cnt0] == -1)
                        continue;
                    bool e0 = s[i] == t[0];
                    bool e1 = s[i] == t[1];
                    bool e01 = t[0] == t[1];
                    dp[i+1][j][cnt0 + e0] =  max(dp[i+1][j][cnt0 + e0], dp[i][j][cnt0] + (e1? cnt0 : 0));//不变
                    if(j < k){
                        dp[i+1][j+1][cnt0 + 1] = max(dp[i+1][j+1][cnt0 +1], dp[i][j][cnt0] + (e01? cnt0 : 0));//变为t0
                        dp[i+1][j+1][cnt0 + e01] = max(dp[i+1][j+1][cnt0 + e01] , dp[i][j][cnt0] + cnt0);//变为t1
                    }
                }
            }
        }
        int ans = 0;
        for(int i=0;i<=k;++i)
            for(int j =0;j<=n;++j)
                ans = max(ans, dp[n][i][j]);
        cout << ans << endl;
    }        
    return 0;
}

  

 

原文地址:https://www.cnblogs.com/newstartCY/p/13659450.html