atcoder ABC 128

目录​​​​​​​

B.guidebook

 c.switches

D.equeue 


B.guidebook

B - Guidebook (atcoder.jp)

atcoder ABC 128_第1张图片

atcoder ABC 128_第2张图片 多关键字排序(按主要关键字,次要关键字排序)

用结构体存储主次要关键字,用sort排序(sort可以对字符串进行排序)

注意,sort的第一个参数写的是要排序的数组的一个元素的地址,第二个参数是在第一个参数的基础上加上排序的个数.比如第一个元素是q[1],共n个,则sort(q+1,q+1+n)

#include
#include
#include
using namespace std;
const int N=110;
struct Resta{
string city;
int score;
int idx;
bool operator<(const Resta &W)const{
if(city!=W.city) return cityW.score;
}
}q[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>q[i].city>>q[i].score;
q[i].idx=i;
}
sort(q+1,q+1+n);
for(int i=1;i<=n;i++) cout<

 c.switches

 D - equeue

atcoder ABC 128_第3张图片

atcoder ABC 128_第4张图片

大致题意:共n个开关,m个灯,每个灯由若干个开关控制,如果第i个灯的开关状态为开的数量对2取余等于p[i],则灯i亮,如果所有灯都亮就算一个合法方案,求一共多少种合法方案

每个开关有两种状态,要么开要么关,一共有n个开关,如果能枚举所有的可能性,然后判断m个灯是否都亮,都亮则计数加一,最后输出答案,于是想到暴力搜索

用dfs,共n个开关,从第一个开关开始搜,对于搜到的开关,给其状态赋值,要么0要么1,等到搜到第n+1时,那么n个开关的一种状态表示就完成了,然后判断该方案是否合法

#include
#include
#include
using namespace std;
const int N=110;
int st[N],s[N][N],k[N],p[N];
int n,m,ans;
void dfs(int x){
if(x<=n){
st[x]=0;
dfs(x+1);
st[x]=1;
dfs(x+1);
}
else{
for (int i = 1; i <= m; i++) {
int sum = 0;
for (int j = 1; j <= k[i]; j++) {
if (st[s[i][j]] == 1)
sum++;
}
if(sum%2!=p[i]){
return ;
}
}
ans++;
return ;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>k[i];
for(int j=1;j<=k[i];j++){
cin>>s[i][j];
}
}
for(int i=1;i<=m;i++){
cin>>p[i];
}
dfs(1);
cout<

D.equeue 

D - equeue (atcoder.jp)

 atcoder ABC 128_第5张图片

 atcoder ABC 128_第6张图片

 做每个题目一开始先按照题目最原始的思路,根据题目表面的意思进行暴力模拟,在此基础上再去优化

暴力模拟,双重循环,左边取几个,右边取几个,因为最多k次操作,剩下的操作次数就删掉负数

每次要找负数,且优先删掉最小的负数,因此想到优先队列(小根堆)

#include
#include
#include
#include
using namespace std;
typedef long long LL;
const int N=52;
int n,m;
int v[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>v[i];
LL res=0;
for(int i=0;i<=n;i++){
for(int j=0;i+j<=n;j++){
if(i+j>m) continue;
int k=m-i-j;
LL ans=0;
priority_queue,greater>heap;
for(int p=1;p<=i;p++){
heap.push(v[p]);
ans+=v[p];
}
for(int p=n;p>=n-j+1;p--){
heap.push(v[p]);
ans+=v[p];
}
while(heap.size()&&heap.top()<0&&k>0){
ans-=heap.top();
k--;
heap.pop();
}
res=max(res,ans);
}
}
cout<

你可能感兴趣的:(Atcoder,Beginner,Contest,排序算法,算法)