AtCoder Beginner Contest 173 题解

A - Payment

首先我们可以把所有不用找零的部分都付掉,这样就只剩下了\(A \mod 1000\)这样一个“\(A\)除以\(1000\)的余数部分”。

然后我们再来用\(1000\)减去它,就是要找的零钱,但是假如刚好余数为\(0\)就会出锅,所以再要特判一下,程序这里直接写进公式里了:

#include<bits/stdc++.h>
using namespace std; int main(){ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); int n;
cin>>n;
cout<<(1000-n%1000)%1000<<endl; return 0;
}

B - Judge Status Summary

这波啊,这波是小学数数(雾)。这就是普通的计数啊,我们可以使用C++的STL中的一位:map

这里讲了map的使用方法:OI-wiki

然后你建立一个字符串对应到整数的map,然后每次读入一个字符串都把对应值加一就行。然后输出每个状态对应的值就好。

#include<bits/stdc++.h>
using namespace std; int main(){ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); map<string,int> mp;
string s;
int n;
cin>>n;
while(n--){
cin>>s;
mp[s]++;
}
cout<<"AC x "<<mp["AC"]<<'\n';
cout<<"WA x "<<mp["WA"]<<'\n';
cout<<"TLE x "<<mp["TLE"]<<'\n';
cout<<"RE x "<<mp["RE"]<<'\n'; return 0;
}

C - H and V

很显然数据这么小,我们可以枚举哪些列需要涂色,然后再计算没有涂过的黑色块就好了。

这里你需要学习状态压缩来更好地枚举涂色的列的集合,你可以把集合压缩成一个整数,当中对应的位为\(1\)表示这一行/列涂色了,否则没有涂。这里来学习位运算状态压缩(状压DP顺便也看看吧,会有用的)。

我这里设置了第\(1\)到\(H\)的二进制位表示对应的行的状态,同理第\(H+1\)到\(W\)位表示对应的列的状态。

#include<bits/stdc++.h>
using namespace std; int h,w,k;
char g[10][10]; int main(){ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); cin>>h>>w>>k;
for(int i=0;i<h;i++){
cin>>g[i];
}
int ans=0;
for(int s=0;s<1<<h+w;s++){//先执行+再执行<<,A<<B表示A*2^B
int c=0;
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
c+=!(s>>i&1)&&!(s>>h>>j&1)&&g[i][j]=='#';//先执行>>再执行&,A>>B&1表示A的第B位,值是1或0
}
}
ans+=c==k;
}
cout<<ans<<endl; return 0;
}

D - Chat in a Circle

首先我们先把\(A\)从大到小排列一下,并从前往后地让对应位置的人进圈。感性地想,让权值高的人先进,就可以影响旁边人的心情更好,可以证明是对的,但我不会qaq。

然后容易看出,除了第一个人只能影响第二个之外,其余的人都有两个可以影响的空位(废话,左右两边各一个,写题解的人脑子有病吧)。然后就好了可以写程序了(

#include<bits/stdc++.h>
using namespace std; int n;
int a[200005]; int main(){ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n,[](const int &a,const int &b){
return a>b;
});
int tot=n-1;
long long ans=0;
for(int i=0;i<n;i++){
if(tot){
ans+=a[i];
tot--;
}
if(tot&&i){
ans+=a[i];
tot--;
}
}
cout<<ans<<endl; return 0;
}

E - Multiplication 4

我们先判断一下能不能弄出一个正的乘积啊,然后退而求其次看能不能弄出\(0\)来,最后再尽量弄一个绝对值小的负数乘积啊。

假如负数两两一对,加上一部分正数能够凑到\(K\)个,就可以弄出正的乘积了。

先看正的乘积,我们把正数负数绝对值从大到小排序,然后两两一对乘起来。然后尽量取大的一对乘起来,最后假如\(K\)是奇数就添上一个单独的正数就好了啊。

UPD: 这边正的乘积需要先考虑\(K\)是奇数的情况并先添上一个正数,否则会被叉。

乘积为\(0\)的话坠简单,输出零就好了。

负数的乘积其实也很简单,由于你已经通过先前的判断证明了不能有正数或者零的乘积,那么只要贪心地取绝对值最小的那些正/负数乘起来就好了。

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const ll mod=1e9+7; ll n,k,zero;
ll a[200005];
vector<ll> pos,neg; void find_pos(){
sort(pos.begin(),pos.end(),[](const ll &a,const ll &b){
return a>b;
});
sort(neg.begin(),neg.end(),[](const ll &a,const ll &b){
return a<b;
});
ll res=k&1?pos.front():1;
ll pi=k&1,ni=0;
while(pi+1<pos.size()&&ni+1<neg.size()&&pi+ni+2<=k){
if(pos[pi]*pos[pi+1]>neg[ni]*neg[ni+1]){
res=res*pos[pi]%mod*pos[pi+1]%mod;
pi+=2;
}else{
res=res*neg[ni]%mod*neg[ni+1]%mod;
ni+=2;
}
}
while(pi+1<pos.size()&&pi+ni+2<=k){
res=res*pos[pi]%mod*pos[pi+1]%mod;
pi+=2;
}
while(ni+1<neg.size()&&pi+ni+2<=k){
res=res*neg[ni]%mod*neg[ni+1]%mod;
ni+=2;
}
cout<<(res+mod)%mod<<endl;
} void find_neg(){
sort(a,a+n,[](const ll &a,const ll &b){
return abs(a)<abs(b);
});
ll res=1;
for(ll i=0;i<k;i++){
res=res*a[i]%mod;
}
cout<<(res+mod)%mod<<endl;
} int main(){ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); cin>>n>>k;
for(ll i=0;i<n;i++){
cin>>a[i];
if(a[i]>0)pos.emplace_back(a[i]);
if(a[i]==0)zero++;
if(a[i]<0)neg.emplace_back(a[i]);
}
if(neg.size()-(neg.size()&1)+pos.size()>=k&&(k&1)<=pos.size()){
find_pos();
}else if(zero){
cout<<"0\n";
}else find_neg(); return 0;
}

F - Intervals on Tree

首先这是一棵树,所以每一条边都会合并左右结点从属的两个连通块为一个。那么对于一条边,对于所有包含它的\(S\)(定义同题目),它就会减少一个连通块。

那么答案一开始就设成假如每个\(S\)中的点都是独立的一个连通块,一共有多少个连通块,然后对于每一条边,答案减去包含它的\(S\)的个数即可。

#include<bits/stdc++.h>
using namespace std; int n; int main(){ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); cin>>n;
long long ans=0;
for(int i=1;i<=n;i++){
ans+=(long long)(n-i+1)*i;
}
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
if(a>b)swap(a,b);
ans-=(long long)a*(n-b+1);
}
cout<<ans<<endl; return 0;
}

AtCoder Beginner Contest 173 题解的更多相关文章

  1. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  2. AtCoder Beginner Contest 153 题解

    目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...

  3. AtCoder Beginner Contest 177 题解

    AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...

  4. AtCoder Beginner Contest 184 题解

    AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...

  5. AtCoder Beginner Contest 172 题解

    AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ...

  6. AtCoder Beginner Contest 169 题解

    AtCoder Beginner Contest 169 题解 这场比赛比较简单,证明我没有咕咕咕的时候到了! A - Multiplication 1 没什么好说的,直接读入两个数输出乘积就好了. ...

  7. AtCoder Beginner Contest 148 题解

    目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ...

  8. AtCoder Beginner Contest 151 题解报告

    总的来说,这次的题目比较水,然而菜菜的我并没有把所有题目都做完,话不多说,直接来干货: A:Next Alphabet 题目链接:https://atcoder.jp/contests/abc151/ ...

  9. AtCoder Beginner Contest 115 题解

    题目链接:https://abc115.contest.atcoder.jp/ A Christmas Eve Eve Eve 题目: Time limit : 2sec / Memory limit ...

随机推荐

  1. Docker之容器化学习之路v20.10.3

    Docker概述 **本人博客网站 **IT小神 www.itxiaoshen.com Docker文档官网 Docker是一个用于开发.发布和运行应用程序的开放平台.Docker使您能够将应用程序与 ...

  2. JDK 动态代理与 CGLIB 动态代理,它俩真的不一样

    摘要:一文带你搞懂JDK 动态代理与 CGLIB 动态代理 本文分享自华为云社区<一文带你搞懂JDK 动态代理与 CGLIB 动态代理>,作者: Code皮皮虾 . 两者有何区别 1.Jd ...

  3. C++ and OO Num. Comp. Sci. Eng. - Part 5.

    类 class 关键字提供了一种包含机制,将数据和操作数据的方法结合到一起,作为内置类型来使用. 类可以包含私有部分,仅其成员和 friend 类访问,公有部分可以在程序中任意位置处访问. 构造函数与 ...

  4. CentOS6.9 内核升级详解

    内核进行的是应用软件和计算机硬件的交互工作在计算机科学中,内核(英语:kernel)又称核心,是一个计算机程序,用来管理软件发出的数据I/O(输入与输出)要求,将这些要求转译为数据处理的指令,交由中央 ...

  5. 暂时lvs

    负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...

  6. 完美png图片添加水印类

    完美png图片添加水印类 被添加水印图片和水印图片都可以是png,保证透明无色背景,可调节透明度 <?phpclass Imgshuiyin{ /* 缩略图相关常量定义 */ const THU ...

  7. jquery操作html中图片宽高自适应

    在网站制作中如果后台上传的图片不做宽高限制,在前台显示的时候,经常会出现图片变形,实用下面方法可以让图片根据宽高自适应,不论是长图片或者高图片都可以完美显示. $("#myTab0_Cont ...

  8. Python添加模块路径

    1.用函数临时添加 1 import sys #导入sys模块 2 3 4 sys.path.append(r'/tmp/test') #要用绝对路径 5 print(sys.path) #查看模块路 ...

  9. 非线性回归支持向量机——MATLAB源码

    支持向量机和神经网络都可以用来做非线性回归拟合,但它们的原理是不相同的,支持向量机基于结构风险最小化理论,普遍认为其泛化能力要比神经网络的强.大量仿真证实,支持向量机的泛化能力强于神经网络,而且能避免 ...

  10. 学习java的第二十天

    一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...