0
点赞
收藏
分享

微信扫一扫

迟到了好久的作业,真的不想再写了

诗尚凝寒 2022-02-10 阅读 15

交 作 业 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[i1];

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;
}

莎莎搞不清位运算符号优先级 括号是个好东西

举报

相关推荐

0 条评论