C.分栏

Solution

先输出奇数位,再输出偶数位。

Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  N = 1e3 + 5;

char s[N];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>s+1;
    for(int i=1;i<=strlen(s+1);i+=2) cout<<s[i];
    for(int i=2;i<=strlen(s+1);i+=2) cout<<s[i];
    cout<<'\n';
    return 0;
}

D.斐波那契数列?

Solution

,由递推式可知
打表输出答案即可,当变化量过小时,趋向于2,直接输出2即可。

反思:我一开始先预处理了Fibonacci数列,然后再根据Fibonacci数列计算,这样在程序里面会出现精度不够高的问题,能少绕弯子就少绕弯子吧,尤其是高精度要求的题目。

Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  N = 1e7 + 5;

double f[N],pre[N];

int main(){
    ll n;cin>>n;
    pre[1]=0.5,pre[2]=0.25;
    double base=8.0;
    double ans=0;
    for(int i=1;i<=n;i++){
        if(i>2) pre[i]=pre[i-2]*0.25+pre[i-1]*0.5;
        if(pre[i]<1e-11) break;
        ans+=pre[i];
    }
    printf("%.9f\n",ans);
    return 0;
}

F.爱买手办的张三

Solution

将所有得到的数的二进制位数记录,二进制枚举加上那些数对应的贡献。

Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  N = 1e6 + 5;

ll y;
bool v[N];
set<int> s;
unordered_map<int,int> M;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>y;
    cout<<1<<'\n'<<y<<'\n';
    ll k=y,base=0,n=0,id=-1;
    while(k){
        if(k&1) M[++id]=n=base;
        base++;
        k/=2;
    }
    for(int i=0;i<1<<id+1;i++){
        ll tmp=0;
        for(int j=0;j<=id;j++)
            if(i&(1<<j)) tmp+=pow(2,M[j]);
        s.insert(tmp);
    }
    cout<<s.size()<<'\n';
    for(auto c:s) cout<<c<<'\n';
    return 0;
}

红绿灯

Solution

不合法的方案:

  1. 出现交叉,如:黄绿,红黄,红绿。
  2. 同一个位置有多个不同的颜色。
  3. 所构造的方案使得G,Y,R中有一个数<1。

    Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  N = 1e6 + 5;

map<pair<int,string>, bool> v;
int cnt[N];
ll n,T;

bool check(){
    string t;
    for(int i=0;i<T;i++){
        if(t=="Yellow" && v.count(mp(i,"Green"))) return true;
        if(t=="Red" && v.count(mp(i,"Yellow"))) return true;
        if(t=="Red" && v.count(mp(i,"Green"))) return true;
        if(cnt[i]>1) return true;
        if(v.count(mp(i,"Green"))) t="Green";
        if(v.count(mp(i,"Yellow"))) t="Yellow";
        if(v.count(mp(i,"Red"))) t="Red";
    }
    return false;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>T;
    int m1=0,m2=INF;
    for(int i=1;i<=n;i++){
        int x;string s;
        cin>>x>>s;
        x=x%T;
        if(s=="Yellow" && x<=0) {cout<<i<<'\n';return 0;}
        if(s=="Red" && x<=1) {cout<<i<<'\n';return 0;}
        if(s=="Green" && x>=T-2) {cout<<i<<'\n';return 0;}
        if(s=="Yellow" && x>=T-1) {cout<<i<<'\n';return 0;}
        if(s=="Green") m1=max(m1,x);
        if(s=="Red") m2=min(m2,x);
        if(m1+1>=m2) {cout<<i<<'\n';return 0;}
        if(!v.count(mp(x%T,s))) v[mp(x%T,s)]=true,cnt[x%T]++;
        if(check()) {cout<<i<<'\n';return 0;}
    }
    cout<<"Correct!\n";
    return 0;
}

L.开学?

Solution

Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  N = 1e6 + 5;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int x,n;
    cin>>x>>n;
    cout<<(x+n-1)%7+1<<'\n';
    return 0;
}

M.送礼物

Solution

求LIS,并记录对应的值输出即可。

Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  N = 2e5 + 5;

ll n,p,a[N],f[N],b[N],len,ans[N];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>p;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    f[1]=a[1],len=1;b[1]=1;
    for(int i=2;i<=n;i++){
        if(a[i]>f[len]) f[++len]=a[i],b[i]=len;
        else{
            int id=lower_bound(f+1,f+1+len,a[i])-f;
            f[id]=a[i];
            b[i]=id;
        }
    }
    ll k=len,mx=INF;
    for(int i=n;i>0;i--){
        if(!k) break;;
        if(b[i]==k && a[i]<mx){
            ans[k--]=i;
            mx=a[i];
        }
    }
    ll s=p;
    for(int i=1;i<=len;i++)    s+=a[ans[i]];
    cout<<s<<'\n';
    cout<<len<<'\n';
    for(int i=1;i<=len;i++){
        cout<<ans[i]<<"\n";
    }
    return 0;
}