AtCoder Beginner Contest 173 题解
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 题解的更多相关文章
- AtCoder Beginner Contest 154 题解
人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...
- AtCoder Beginner Contest 153 题解
目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...
- AtCoder Beginner Contest 177 题解
AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...
- AtCoder Beginner Contest 184 题解
AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...
- AtCoder Beginner Contest 172 题解
AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ...
- AtCoder Beginner Contest 169 题解
AtCoder Beginner Contest 169 题解 这场比赛比较简单,证明我没有咕咕咕的时候到了! A - Multiplication 1 没什么好说的,直接读入两个数输出乘积就好了. ...
- AtCoder Beginner Contest 148 题解
目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ...
- AtCoder Beginner Contest 151 题解报告
总的来说,这次的题目比较水,然而菜菜的我并没有把所有题目都做完,话不多说,直接来干货: A:Next Alphabet 题目链接:https://atcoder.jp/contests/abc151/ ...
- AtCoder Beginner Contest 115 题解
题目链接:https://abc115.contest.atcoder.jp/ A Christmas Eve Eve Eve 题目: Time limit : 2sec / Memory limit ...
随机推荐
- MySQL数据库从入门到放弃(目录)
目录 MySQL数据库从入门到放弃 推荐阅读 MySQL数据库从入门到放弃 193 数据库基础 194 初识MySQL 195 Windows安装MySQL 196 Linux安装MySQL 197 ...
- IPv4 寻址方式简介
IPv4 支持三种不同类型的寻址模式.单播寻址方式.广播寻址方式和组播寻址方式.本章节我们来介绍这些寻址方式. 单播寻址方式 在这种模式下,数据只发送到一个目标主机.Destination Addre ...
- Redis 很屌,不懂使用规范就糟蹋了
这可能是最中肯的 Redis 使用规范了 码哥,昨天我被公司 Leader 批评了. 我在单身红娘婚恋类型互联网公司工作,在双十一推出下单就送女朋友的活动. 谁曾想,凌晨 12 点之后,用户量暴增,出 ...
- Codeforces 739C - Alyona and towers(线段树)
Codeforces 题目传送门 & 洛谷题目传送门 可能有人会问我为什么为这道 *2500 的 D1C 写题解,我觉得大概是想要在写题解数量上 dd ycx 吧,因为 ycx 到目前为止写了 ...
- 【R】行或列数目不同的两个数据框如何用rbind/cbind合并?
目录 前言 方法一:dplyr的bind_rows 方法二:plyr的rbind.fill 前言 通常我们用rbind和cbind合并相同行列的数据框.当两个数据框具有不同行列数目时,直接用会报错. ...
- Jvarkit : Java utilities for Bioinformatics
Jvarkit : Java utilities for Bioinformatics :一个java写的生物信息工具包:http://lindenb.github.io/jvarkit/
- 计算机网络-4-7-内部网关协议OSPF
内部网关协议OSPF(开放最短路径优先) 出现的原因:为了克服RIP协议的缺点在1989年开发出来,**开放 表明OSPF协议不受任何厂家的限制.最短路径优先是因为使用了最短路径算法SPF**. OS ...
- c#表中信息点击跳转
OnRowCommand="gridInfoData_RowCommand" <Columns> <asp:ButtonField HeaderText=&quo ...
- 使用 CliWrap 让C#中的命令行交互举重若轻
在代码中进行命令行交互是一个很常见的场景, 特别是在一些CI CD 自动化流程中, 在这之前我们会使用 System.Diagnostics.Process API, 现在有一个更灵活的工具 CliW ...
- 利用抖音Cookie充值接口提取支付链接,个人调起原生微信h5支付宝h5支付
最近开始搞一些个人支付通道的开发,方便个人不用和第三方平台签约就能收款,省去很多流程手续的成本. 然后翻了一下网上并没有太多现成的技术教程,只能自己研究着搞了. 这次要分享的是利用抖音的充值接口,去分 ...