Codeforces Round #739 (Div. 3)

A. Dislike of Threes

简单的水题,预处理即可

AC_CODE

#include <bits/stdc++.h>

using namespace std;

template < typename T >
inline void read(T &x)
{
    x = 0; bool f = 0; char ch = getchar();
    while(!isdigit(ch)){f ^= !(ch ^ 45);ch=getchar();}
    while(isdigit(ch)) x= (x<<1)+(x<<3)+(ch&15),ch=getchar();
    x = f ? -x : x;
}
const int N = 1e5 + 10;
int a[N];
void solve() {
	int n; read(n);
	printf("%d\n", a[n]);
}

signed main()
{
	int p = 1;
	for(int i = 1; p < 1110; i ++ ) {
		if(i % 3 == 0 || i % 10 == 3) continue;
		a[p ++ ] = i;
	}
    int T = 1;cin >> T;
    while(T -- ) solve();
    return 0;
}

B. Who's Opposite?

sb题
找到这个环的中间位置,然后判断三个数字是否在环外即可

AC_CODE

#include <bits/stdc++.h>

using namespace std;

template < typename T >
inline void read(T &x)
{
    x = 0; bool f = 0; char ch = getchar();
    while(!isdigit(ch)){f ^= !(ch ^ 45);ch=getchar();}
    while(isdigit(ch)) x= (x<<1)+(x<<3)+(ch&15),ch=getchar();
    x = f ? -x : x;
}
 
void solve() {
	int a, b, c;
	read(a); read(b); read(c);
	if(a > b) swap(a, b);
	int res = b - a;
	int len = res * 2;
	if(b > len || c > len) {
		puts("-1");
		return;
	}
	int ans = c + res;
	if(ans > 2 * res) ans %= (2 * res);
	
	printf("%d\n",ans);
}
 
signed main()
{
    int T = 1;cin >> T;
    while(T -- ) solve();
    return 0;
}

C - Infinity Table

预处理出所有的平方数

  • 首先判断这个数字是在哪一行or哪一列 (开方向上取整即可) 假设这个数字是idx
  • 其次判断这个数字是在列还是行
  • 如果是列 则输出 n - \(idx^2\) 如果是行则输出 \((idx+1)^2\) - n + 1
#include <bits/stdc++.h>

using namespace std;

template < typename T >
inline void read(T &x)
{
    x = 0; bool f = 0; char ch = getchar();
    while(!isdigit(ch)){f ^= !(ch ^ 45);ch=getchar();}
    while(isdigit(ch)) x= (x<<1)+(x<<3)+(ch&15),ch=getchar();
    x = f ? -x : x;
}
const int N = 1e5 + 10;
int a[N];
int p = 1;
void solve() {
	int n; read(n);
	int idx = lower_bound(a + 1, a + 1 + p, n) - a;
	int res = n - a[idx - 1];
	if(res <= idx) {
		printf("%d %d\n", res, idx);
		return;
	}
	res = a[idx] - n;
	printf("%d %d\n", idx, res + 1);
	
}

signed main()
{

	for(int i = 1; i <= INF / i; i ++ )	 {
		a[p ++] = i * i;
	}

    int T = 1;cin >> T;
    while(T -- ) solve();
    return 0;
}

D - Make a Power of Two

预处理出所有的 \(2^n\)
暴力枚举从原来的数字操作到 \(2^n\) 所需的最小操作次数 取最小值
最小操作次数判断时候,即是判断重复子序列长度

AC_CODE

//#pragma GCC optimize (2)
//#pragma G++ optimize (2)
#include <bits/stdc++.h>

using namespace std;

template < typename T >
inline void read(T &x)
{
    x = 0; bool f = 0; char ch = getchar();
    while(!isdigit(ch)){f ^= !(ch ^ 45);ch=getchar();}
    while(isdigit(ch)) x= (x<<1)+(x<<3)+(ch&15),ch=getchar();
    x = f ? -x : x;
}
 
string a[63];

void solve() {
    string x; cin >> x;
    int ans = INF;
    int p = x.size();
    for(int i = 0; i < 63; i ++ ) {
        int len = a[i].size(), tt = 0;
        for(int j = 0; j < p; j ++ ) {
            if(tt < len && x[j] == a[i][tt]) tt ++; 
        }
        int r = len - tt + p - tt;
        ans = min(ans, r);
        if(ans > r) {
            cout << i << endl;
            ans = r;
        }

    }
    printf("%d\n", ans);
}
 
signed main() 
{
    for(int i = 0; i < 63; i ++ ) {
        LL p = (1LL << i);
        a[i] = to_string(p);
    }
    int T = 1;cin >> T;
    while(T -- ) solve();
    return 0;
}

E - Polycarp and String Transformation

题意

对于一个字符串\(a\) 给出\(a\)经过以下操作获得的字符串

  • \(ans\) = \(a\)
  • 每次删去\(a\)中的每个字符(删除\(a\)中的全部的这个字符)得到新的\(a\) \(ans+=a\)
  • 进行上述两个操作直到\(a\)为空字符串
    给定 \(ans\) 求是否存在 一个\(a\) 可以经过上述操作的到\(ans\)
    -若存在 输出 \(a\) 以及操作顺序
    -若不存在 输出 \(-1\)

思路

假设存在\(a\),我们通过\(ans\) 就可以得到操作顺序(倒序寻找即可)
没操作一个字符,这个字符就在后面不会出现, 通过这个我们可以知道,
每个字符出现的总次数一定是这个字符出现的轮次的倍数
因此通过判断上述条件即可得出无解的情况
下面我们讨论一下有解的情况

  • 我们已经得到了操作字符的顺序
  • 由于每个字符在它可能出现的轮次中出现的个数都是一样的,\(a\)中的字符个数可以通过这个结论求出
    即 每个字符出现的总次数除以这个字符出现的轮次
  • 通过上述两个操作我们可以得到 \(a\) 字符串,然后模拟题中所给操作即可
    最后判断模拟得到的字符串是否和给定字符串相同即可

AC_CODE

#include <bits/stdc++.h>
#define x first    
#define y second    
#define pb push_back
#define mk make_pair
#define debug(x) cout<<#x" ----> "<<x<<endl
#define rep(i, b, s) for(int i = (b); i <= (s); ++i)
#define pre(i, b, s) for(int i = (b); i >= (s); --i)

//#define int long long 
#define endl '\n' 
#define ios ios::sync_with_stdio(false); cin.tie(0), cout.tie(0)
#define all(v) (v).begin(),(v).end()

using namespace std;
 
typedef unsigned long long ULL;
typedef pair<int, int> PII ;
typedef pair<double, double> PDD ;
typedef long long LL;
const int INF = INT_MAX;
const int mod = 1e9 + 7;
const double eps = 1e-10;
const double pi = acos(-1.0);
   
int lowbit(int x){return x&-x;} 
int gcd(int a, int b) {return b ? gcd(b, a%b) : a;}
LL ksm(LL a, LL b) {if (b == 0) return 1; LL ns = ksm(a, b >> 1); ns = ns * ns % mod; if (b & 1) ns = ns * a % mod; return ns;}
LL lcm(LL a, LL b) {return a / gcd(a, b) * b;}
template < typename T >
inline void read(T &x)
{
    x = 0; bool f = 0; char ch = getchar();
    while(!isdigit(ch)){f ^= !(ch ^ 45);ch=getchar();}
    while(isdigit(ch)) x= (x<<1)+(x<<3)+(ch&15),ch=getchar();
    x = f ? -x : x;
}
 
void solve() {
    vector<int> vis(26);
    string p;
    string a; cin >> a;
    
    for(int i = (int)a.size() - 1; ~i; i -- ) {
        if(!vis[ a[i] - 'a' ]) p.pb(a[i]);
        vis[ a[i] - 'a' ] ++;
    }

    int len = p.size();
    int res = 0;
    for(int i = 0; i < len; i ++ ) {
        int ans = vis[p[i] - 'a'] % (len - i);
        if(ans) {
            puts("-1");
            return;
        }
        res += vis[p[i] - 'a'] / (len - i);
    }
    string curr = a.substr(0, res);
    string accept = curr, wa = curr, temp;
    reverse(all(p));
    for(int i = 0; i < len; i ++ ) {
        temp = "";
        for(int j = 0; wa[j]; j ++ ) {
            if(wa[j] != p[i]) temp.pb(wa[j]);
        }
        accept += temp;
        wa = temp;
    }
    if(accept == a) {
        printf("%s %s\n", curr.c_str(), p.c_str());
    }
    else puts("-1");

}
 
signed main() 
{
    int T = 1;  scanf("%d",&T);
    while(T -- ) {
        solve();
    }
 
    return 0;
}
posted @ 2021-08-19 01:47  ccz9729  阅读(65)  评论(0编辑  收藏  举报