交 作 业 Q A Q 交作业QAQ 交作业QAQ
迟到了好久的作业 不想接着写了。。
A-R
题先放在这。。。
B-进制
只是证明有这道题
C-蓝彗星
前缀和 & \& &差分
还学到一种使代码看起来更好看的写法(见代码)
AC Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5+10; //!1<=t,ai<=1e5 -> t+ai<=2e5
int b[N],r[N];
string s;
signed main(){
int n,t,a,sumt=0; cin >> n >> t;
cin >> s;
for(int i=0;i<n;i++)
{
cin >> a;
if(s[i]=='B') b[a]++,b[a+t]--;
else r[a]++,r[a+t]--;
}
for(int i=1;i<2e5;i++)
{
//b[i]+=b[i-1],r[i]+=r[i-1];
//if(b[i]&&!r[i]) sumt++;
b[i]+=b[i-1],r[i]+=r[i-1],sumt+=(b[i]&&!r[i]);//更优美版本
}
cout << sumt << endl;
return 0;
}
第一次写前缀和和差分的题,有几点需要注意:(写给憨憨)
对于要改变的区间,如将 [ n , m ] + k [n,m]+k [n,m]+k,则需 a r r [ n ] + k , a r r [ m + 1 ] − k arr[n]+k,arr[m+1]-k arr[n]+k,arr[m+1]−k;
接下来求前缀和的循环, f o r ( i = 1 ; i < n ; i + + ) a r r [ i ] + = a [ i − 1 ] ; for(i=1;i<n;i++)\ arr[i]+=a[i-1]; for(i=1;i<n;i++) arr[i]+=a[i−1];
D-雪色光晕
E-真假签到题
测试发现输入==输出
AC Code
#include <bits/stdc++.h>
using namespace std;
// long long f(long long x){
// if(x==1)return 1;
// return f(x/2)+f(x/2+x%2);
// }
signed main(){
long long x;
cin >> x;
cout << x;
return 0;
}
F-小红的记谱法
原本思路卡在了 到底怎么能计完key再输出啊??最后 我脑袋是不转了吗???
原写法T·T :
先判字母,再判" > , < >,< >,<",然后发现,就算 c o n t i n u e continue continue了还是会先加上字母啊。。。(欲哭无泪.jpg)
AC Code
#include <bits/stdc++.h>
using namespace std;
string s,ans="";
signed main(){
int key=0,len=0;
cin >> s;
len=s.length();
for(int i=0;i<len;i++)
{
if(s[i]=='<'){
key--;
continue;
}
if(s[i]=='>') {
key++;
continue;
}
if(s[i]=='C') ans+='1';
else if(s[i]=='D') ans+='2';
else if(s[i]=='E') ans+='3';
else if(s[i]=='F') ans+='4';
else if(s[i]=='G') ans+='5';
else if(s[i]=='A') ans+='6';
else if(s[i]=='B') ans+='7';
if(key>0){
for(int i=0;i<key;i++) ans+='*';
}
else if(key<0){
//key=abs(key); 这里变了之后都就变了。。。
for(int i=0;i<abs(key);i++) ans+='.';
}
}
cout << ans << endl;
return 0;
}
G-子序列权值乘积
这个搞不了,晾在这
H-真真真真真签到题
他想离她最近,她想离他最远,两人都选最优策略,那么一人选正方体中心,一人选一顶角,然后是数学
AC Code
#include <bits/stdc++.h>
using namespace std;
double a,d;
signed main(){
cin >> d;
a=8.0*sqrt(3)/9*d*d*d;
printf("%.7f",a);
return 0;
}
I-爆炸的符卡洋洋洒洒
0-1背包问题,有待探究。。。
G
NULL
K-小红的真真假假签到题题
构造题~
如果我们在 x x x后加若干 0 0 0得到 y y y,那 y y y是 x x x的若干个 2 2 2倍,但此时不满足二进制串中 1 1 1的个数不相同的条件,
给定的 x x x二进制串中一定是有 1 1 1的,如果我们将此时的 y y y加上 x x x,此时 y y y就是 x x x的 2 n + 1 2^n+1 2n+1倍了>o<
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
signed main(){
int x,y,t=0; cin >> x;
int tmp=x;
while(tmp){
tmp >>= 1,t++;
}
cout << (x<<t) + x << endl;
return 0;
}
莎莎搞不清位运算符号优先级 括号是个好东西