AtCoder Beginner Contest 310 - A B C E
题目传送门:abc 310
比赛摘记:
B题没读懂题意。。。如此简单题卡了好久
继续加油哈
A
简单,就是判断使用优惠券 Q 加一个价格最小的菜 D 便宜还是原价便宜,输入比较,在输出即可
B
打的时候题意没读懂。。。读懂了的时候时间已经过去一大半了qwq
就是给你一大堆产品,每个产品都有各自的价值 P 与功能 C 。问你是否存在两个产品[i,j],使得以下三个条件同时成立:
- \(P_i\ge P_j\)
- 产品 j 拥有产品 i 的所有功能
- 要么\(P_i>P_j\),要么产品 j 拥有产品 i 没有的功能
打时死于第三条,or没整明白
因为数据规模较小,暴力匹配即可
C
题意:
一个字符串与其翻转字符串同属一类,问你给定的许多字符串能分为多少类
思路:
利用set或者map标记某一类字符串是否出现过,每次没出现过的时候++ans,最终ans即为答案
过程较为简单,模拟统计,使用STL即可
E - NAND repeatedly
题意:
⊼ 表示逻辑运算与非,\(0⊼0=1,0⊼1=1,1⊼0=1,1⊼1=0\)
思路:
注意到\(1≤N≤10^6\),\(O(n^2)\)的方法估计不行,所以我们需要考虑题目的规律性。
首先我们知道与非有0出1,所以当\(A_j=0\)时,\(f(i,j)=1\)
当\(A_j=1\)时,我们就需要考虑前面的\(f(i,j-1)\)的值,而此时结果即为\(\overline{f(i,j-1)}(取非)\)
所以一遍前往后的递推式即可求解,我们统计到每个位置的0和1的数量,为了下一位做准备。那么统计的是什么0和1呢?就是\(f(i,j)\)在每个i时0和1的数量。
以样例00110
为例,我们可以画出下面的表:
i | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
\(A_i\) | 0 | 0 | 1 | 1 | 0 |
i=1 | 0 | 1 | 0 | 1 | 1 |
i=2 | x | 0 | 1 | 0 | 1 |
i=3 | x | x | 1 | 0 | 1 |
i=4 | x | x | x | 1 | 1 |
i=5 | x | x | x | x | 0 |
总 | 0:1,1:0 | 0:1,1:1 | 0:1,1:2 | 0:2,1:2 | 0:1,1:4 |
ans即为所有的1的个数和
我们用p[0]和p[1]来记录从前到后遍历i时0和1的个数。
- 当\(A_i=0\)时,$p[0]=1,p[1]=i-1 $
- 当\(A_i=1\)时,我们就需要考虑前面的\(f(i,j-1)\)的值,而此时\(p[0]=pp[1],p[1]=pp[0]+1\),pp代表原来的值
感觉没有说清楚,看的时候结合上面那张表再理解理解?
好像可以再精简一点的,上面写的好理解,在理解的基础上会发现,出答案的方式有很多其实,比如说没必要统计每一个位置上1的个数,只需要统计0的个数就够了,因为1的个数无论在哪种情况都可以计算出来。
下为代码:
//>>>Qiansui
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
#define debug(x) cout << #x << " = " << x << endl
#define debug2(x,y) cout << #x << " = " << x << " " << #y << " = "<< y << endl
//#define int long long
using namespace std;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<ull,ull> pull;
typedef pair<double,double> pdd;
/*
*/
const int maxm=2e5+5,inf=0x3f3f3f3f,mod=998244353;
int n;
string ss;
void solve(){
cin>>n>>ss;
ll ans=0;
int p[2]={0,0};
for(int i=0;i<n;++i){
int c=ss[i]-'0';
ans+=c;
if(i){
if(c==0){
ans+=i;
p[0]=1;
p[1]=i;
}else{
ans+=p[0];
swap(p[0],p[1]);
++p[c];
}
}else ++p[c];
}
cout<<ans<<'\n';
return ;
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int _=1;
// cin>>_;
while(_--){
solve();
}
return 0;
}
本文来自博客园,作者:Qiansui,转载请注明原文链接:https://www.cnblogs.com/Qiansui/p/17557098.html