Codeforces Round 1057 (Div. 2)(A-D)
题目链接:Dashboard - Codeforces Round 1057 (Div. 2) - Codeforces
A. Circle of Apple Trees
思路
相同的数只能吃一次
代码
void solve(){int n;cin>>n;map<int,bool> mp;int cnt=0;for(int i=1;i<=n;i++){int x;cin>>x;if(!mp[x]) cnt++;mp[x]=true;}cout<<cnt<<"\n";
}
B. Bitwise Reversion
思路
感觉类似于贪心,观察这三个式子
- a&b=x
- b&c=y
- a&c=z
我们不妨先填成
- x&x=x
- y&y=y
- z&z=z
这样就能够很容易想到,因为是&我们必须保证a有x以及z中二进制下所有的1即 a= x | z
同理,b=x|y , c=y|z
最后检查一下上面式子是否成立即可
代码
void solve(){int x,y,z;cin>>x>>y>>z;int a=(x|z);int b=(x|y);int c=(y|z);if(((a&b)==x)&&((b&c)==y)&&((a&c)==z)){cout<<"YES\n";}else{cout<<"NO\n";}
}
C. Symmetrical Polygons
思路
贪心地去看一共有三种情况:
1.全是成对的边
成立条件:除了只有一对的情况,其余的都能够成立
2.有一条不是成对的边
成立条件:x<sum x为独立边的长度,sum为所有成对边的边长和
3.有两条不是成对的边
成立条件:x-y<sum(x>y) x为较长的独立边,y为较短的,sum为所有成对边长和
以上三种情况都考虑贪心即可求出最终答案
代码
#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;const int N=2e5+10;
const int inf=1e18;
const int mod=998244353;void solve(){int n;cin>>n;vi a(n+1);map<int,int> mp;for(int i=1;i<=n;i++){cin>>a[i];mp[a[i]]++;}int sum=0;vi res; //记录单个边int ct=0;for(auto [x,cnt]:mp){sum+=(cnt/2)*2*x;ct+=(cnt/2);if(cnt%2){res.push_back(x);}}sort(res.begin(),res.end(),greater<int>());int s=0;int ans=sum;for(int i=0;i<res.size();i++){if(res[i]<sum){s=res[i];break;}}if(res.size()>=2){for(int i=1;i<res.size();i++){if(res[i-1]-res[i]<sum){s=max(s,res[i-1]+res[i]);}}}if(ct==1&&s==0){cout<<"0\n";return;}cout<<ans+s<<"\n";
}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}
D. Not Alone
思路
圆形很难考虑我们把他弄成条形的即可,贪心的找断开的位置,找到abs(a[i]-a[i-1])最小的位置,为保证准确性我们最好左右位置都跑一遍dp, 防止出现1 1 1 100 10 1 1 而断开位置在n前面
对于条形的数组来看,是由大小为2和3的块组成的,所以dp就很好想了
代码
#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;const int N=2e5+10;
const int inf=1e18;
const int mod=998244353;int n;
int f(int id,vi& a){vi res;for(int i=id;i<=n;i++){res.push_back(a[i]);}for(int i=1;i<id;i++){res.push_back(a[i]);}vector<int> dp(n+1,inf);dp[0]=0;for (int i=2;i<=n;i++) {if (dp[i-2] != inf) {int cost = abs(res[i - 2] - res[i - 1]);dp[i] = min(dp[i], dp[i - 2] + cost);}if (i >= 3 && dp[i - 3] != inf) {int mi= min({res[i - 3], res[i - 2], res[i - 1]});int mx=max({res[i - 3], res[i - 2], res[i - 1]});int cost=mx-mi;dp[i] = min(dp[i], dp[i - 3] + cost);}}return dp[n];
}void solve(){cin>>n;vi a(n+1);for(int i=1;i<=n;i++){cin>>a[i];}int id=0;int mn=inf;for(int i=1;i<=n;i++){int x=a[i];int y=(i==n?a[1]:a[i+1]);if(mn>abs(x-y)){id=i;mn=abs(x-y);}}int ans;int eid=(id==n?1:id+1);int sid=(id==1?n:id-1);ans=min({f(sid,a),f(id,a),f(eid,a)});cout<<ans<<"\n";
}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}