原博客使用更佳: 戳我
比赛链接: Codeforces Round #826 (Div. 3)
A
- 题意 : 判断两个尺码谁大谁小,严格按照L>M>S,对于L而言,X越多越大。对于S而言,X越多越小。
- tag:模拟
#include<iostream>
using namespace std;
void solve(){
string a="";
string b="";
cin>>a>>b;
//cout<<a<<" "<<b<<endl;
if(a.find("L") != a.npos && b.find("L") == b.npos){
cout<<">"<<endl;
return;
}
if(a.find("L") == a.npos && b.find("L") != b.npos){
cout<<"<"<<endl;
return;
}
if(a.find("S") != a.npos && b.find("S") == b.npos){
cout<<"<"<<endl;
return;
}
if(a.find("S") ==a.npos && b.find("S") != b.npos){
cout<<">"<<endl;
return;
}
if(a.find("S") != a.npos && b.find("S") != b.npos){
if(a.size() < b.size()) cout<<">"<<endl;
else if(a.size() > b.size())cout<<"<"<<endl;
else cout<<"="<<endl;
return;
}
if(a.find("L")!=a.npos && b.find("L") != b.npos){
if(a.size() < b.size()) cout<<"<"<<endl;
else if(a.size() > b.size())cout<<">"<<endl;
else cout<<"="<<endl;return;
}
if(a == "M" && b== "M") cout<<"="<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
}
B Funny Permutation
tag : 简单构造
题意: 给出给出长度n,返回任意符合以下要求的数组:1.不可以存在a[i]=i;2.对于每一个元素,只要有一个与他相邻的元素与他在值上也相邻。如果不存在,直接返回-1.
做法: 如果是偶数,那么可以将1~n两两一组交换即可
如果是奇数,只需要把最大的两个数放在前面即可,后面顺序输出
#include<iostream>
using namespace std;
int a[1010000];
void solve(){
int n;
cin>>n;
if(n == 2){
cout<<2<<" "<<1<<endl;
return;
}
if(n == 3){
cout<<-1<<endl;
return;
}
if(n % 2 == 0){
for(int i = 1;i <= n;i++) a[i] = i;
for(int i = 1;i <= n-1;i+=2) swap(a[i],a[i+1]);
for(int i = 1;i <= n;i++) cout<<a[i]<<" ";
}
else{
cout<<n<<" "<<n-1<<" ";
for(int i = 1;i <= n -2;i++) cout<<i<<" ";
}
cout<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
}
C. Minimize the Thickness
题意 :一个长度为n的数组,将其分成连续不重合的几部分,各部分数字之和相等。定义thickness为分完之后最长的那一部分的长度。求得出一个数组可能的thickness的最小值。
思路分析; 由于n只有2000的数量级所以我们可以暴力枚举
每一部分都是sum的因子,所以我们可以将其分解因式后暴力
#include<iostream>
#include<algorithm>
using namespace std;
int a[2020];
int n,sum;
int check(int sum){
int cnt = 0,len = 0;
int ans = 0;
for(int i = 1;i <= n;i++){
cnt += a[i],len++;
if(sum == cnt){
cnt = 0;
ans = max(ans,len);
len = 0;
}
else if(sum < cnt){
return -1;
}
}
return ans;
}
void solve(){
cin>>n;
int ans = 1e9;
for(int i = 1;i <= n;i++) cin>>a[i],sum += a[i];
for(int i = 1;i <= sum / i;i++){
if(sum % i == 0){
int k = check(i);
if(k != -1) ans = min(ans,k);
k = check(sum / i);
if(k != -1) ans = min(ans,k);
}
}
cout<<ans<<endl;
}
int main()
{
int t;
cin>>t;
while(t--){
solve();
}
}
D. Masha and a Beautiful Tree
题目大意:
一棵完全二叉树,拥有n个叶子结点,且叶子节点的值为1-n的任意排列。现在存在一个操作,选定一个节点,交换其左右子树。问将叶子结点的权值修改成从左到右递增最少需要多少次操作。
题目分析:
从两个输出结果是-1的样例可以看出来,如果两个区间中,一个区间的最小值比另一个区间最大值的要小的话,无论怎么还都无法满足需求。也就是有解的条件为:区间最小值大于另一个区间的最大值。
每次往下走之后观察是否有解(扫一下最大值和最小值即可)
#include<iostream>
using namespace std;
int n;
const int N = 2e6 + 10;
int a[N],s[N];
int ans;
const int INF = 1e9;
void dfs(int l, int r) {
if(l == r) return ;
int mid = (l + r) >> 1;
if(a[l] > a[r]) ans ++ ;
int mn1 = INF, mx1 = 0, mn2 = INF, mx2 = 0;
for(int i = l; i <= mid; i ++ )
mn1 = min(mn1, a[i]), mx1 = max(mx1, a[i]);
for(int i = mid + 1; i <= r; i ++ )
mn2 = min(mn2, a[i]), mx2 = max(mx2, a[i]);
if(a[l] > a[r]) {
if(mn1 < mx2) ans = INF;
} else {
if(mx1 > mn2) ans = INF;
}
dfs(l, mid), dfs(mid + 1, r);
}
void solve(){
int n;
cin>>n;
ans = 0;
bool flag = false;
for(int i = 1;i <= n;i++){
cin>>a[i];
}
if(n == 1){
cout<<0<<endl;
return;
}
dfs(1,n);
if(ans >= INF ) cout<<-1<<endl;
else cout<<ans<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
}
E. Sending a Sequence Over the Network
dp
题目大意
给定几段序列拼接在一起,其中它们的长度被放在序列的左边或右边,问是否合法
题目分析
dp[i]表示1~i的序列是合法的,我们只分析i是表示序列长度的点.
如果它在线段的左边,只有dp[i−1]=true,它才有意义。然后dp (i + b[i]]= true。
如果它在线段的右侧,那么如果dp[i−b[i]−1]=true,则dp[i]=true。
#include <bits/stdc++.h>
using namespace std;
#define forn(i, n) for (int i = 0; i < int(n); i++)
#define sz(v) (int)v.size()
#define all(v) v.begin(),v.end()
#define eb emplace_back
void solve() {
int n; cin >> n;
vector<int> a(n+1);
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
vector<bool> dp(n+1, false);
dp[0] = true;
for (int i = 1; i <= n; ++i) {
if (i + a[i] <= n && dp[i-1]) dp[i + a[i]] = true;
if (i - a[i] - 1 >= 0 && dp[i - a[i] - 1]) dp[i] = true;
}
cout << (dp[n] ? "YES" : "NO") << '\n';
}
int main() {
int t;
cin >> t;
forn(tt, t) {
solve();
}
}