第二次积分赛

斐波那契数列在存到i=50的时候就爆炸了,没有数组能够存下,虽然会溢出,但是可以比较后边的几位,故都设置为ull类型,遍历一下也就1e5,记得输入用字符串,数据和位置的对应可以用map《数组,int》。

#include<bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
 
const int N = (int) 100000 + 11;
const int M = (int) 1e6 + 11;
const int MOD = (int) 1e9 + 7;
const int INF = (int) 0x3f3f3f3f;
 
ull f[N]={0,1};
map<ull, int> mp;
int main(){
    mp[1] = 1; mp[0] = 0;
    for(int i = 2; i < N; i++){ 
         f[i] = f[i-1] + f[i-2];
         mp[f[i]] = i;
    }
    int T; cin>>T;
    while(T--){
        string s; cin>>s;
        ull ans=0;
        for(int i = 0; s[i]; i++) ans = (ans * 10 + s[i] - '0');
        cout<<mp[ans]<<"\n";
    }
return 0;
}

B

 

学长也没讲,看着有点难,日后再补。

#include<bits/stdc++.h>
using namespace std;
#define rep(i, j, n) for(int i=j;i<n;i++)
#define per(i, j, n) for(int i=n;i>j;--i)
const int MAXN = (int)1e5+ 5;
const int MOD = 1000000007;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-8;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;

map<int, int> mp;
pii dat[MAXN];
int u[MAXN], d[MAXN], ip[MAXN];

int main() {
    int k, q;
    while(scanf("%d%d", &k, &q) != EOF) {
        memset(u, 0x00, sizeof(u));
        memset(d, 0x00, sizeof(d));
        for(int i = 1; i <= k; ++i) {
            scanf("%d", &dat[i].first);
        }
        for(int i = 1; i <= k; ++i) {
            scanf("%d", &dat[i].second);
        }
        sort(dat + 1, dat + k + 1);
        for(int i = 2; i <= k; ++i) {
            u[i] += u[i - 1];
            d[i] += d[i - 1];
            if(dat[i].second < dat[i - 1].second) ++u[i];
            if(dat[i].second > dat[i - 1].second) ++d[i];
        }
        for(int i = 1; i <= k; ++i) ip[i] = dat[i].first;
        u[k + 1] = u[k];
        d[k + 1] = d[k];
        for(int i = 0; i < q; ++i) {
            int l, r;
            scanf("%d%d", &l, &r);
            int ll = lower_bound(ip + 1, ip + 1 + k, l) - ip;
            int rr = upper_bound(ip + 1, ip + 1 + k, r) - ip - 1;
            puts(rr <= ll || u[rr] == u[ll] || d[rr] == d[ll] ? "Possible" : "Impossible");
        }
    }
    return 0;
}

C 水题

D

9!=7!*3!*3!*2!
8=7*2*2*2
6=5*3
4=3*2*2
用一个vector,对输入的字符串分解,存放后排序输出就好
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
#define pb push_back
 
int main() {
    int T, n, x;
    cin >> T;
    while(T--) {
        vector<int> v,vv;
        string s;
        cin >> n;
        cin >> s;
        for(int i = 0; i < n; ++i) {
            x = s[i]-'0';
            if(x == 9) {
                v.pb(7); v.pb(3); v.pb(3); v.pb(2);
            }
            else if(x == 8) {
                v.pb(7); v.pb(2); v.pb(2); v.pb(2);
            }
            else if(x == 6) {
                v.pb(5); v.pb(3);
            }
            else if(x == 4) {
                v.pb(3); v.pb(2); v.pb(2);
            }
            else if(x!=1&&x!=0)
                v.pb(x);
        }
        sort(v.begin(), v.end(), greater<int>());
        for(int i = 0; i < v.size(); ++i) {
            cout << v[i];
        }
        cout << "\n";
    }
 
    return 0;
}

 sort(v.begin(), v.end(), greater<int>());  从大到小排列 输出

E 水题

F

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 2e5+10;
int n,m;
int x[MAXN];
int px[MAXN],uu,vv;
int ans[MAXN];
int s1[MAXN],s2[MAXN],tt=1;
int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int T;
    cin >> T;
    while(T--) {
        memset(px, 0, sizeof px);
        memset(ans, 0, sizeof ans);
        memset(s2, 0, sizeof s2);
        memset(s1, 0, sizeof s1);
        scanf("%d%d",&n,&m);
        int a,b,c,i,j,k;
        for(a=1;a<=n;a++)
            scanf("%d",&x[a]);
        s2[0]=19260817;
        for(a=1;a<=m;a++) {
            scanf("%d%d",&i,&j);
            while(j>=s2[tt-1]) tt--;
            s2[tt]=j;s1[tt]=i;tt++;
        }
        k=s2[1];
        for(a=1+k;a<=n;a++)
            ans[a]=x[a];
        for(a=1;a<=k;a++)
            px[a]=x[a];
        sort(px+1,px+k+1);
        uu=1;vv=k;
        s2[tt]=0;
        for(a=1;a<tt;a++) {
            if(s1[a]==1) {
                for(b=s2[a];b>s2[a+1];b--)
                ans[b]=px[vv--];
            }
            else {
                for(b=s2[a];b>s2[a+1];b--)
                ans[b]=px[uu++];
            }
        }
        for(a=1;a<n;a++)
            printf("%d ",ans[a]);
        printf("%d\n",ans[n]);
    }
    return 0;
}

难 日后再补

G 水题

H

H

#include<cstdio>
const int N=1e7+10;
const int mod=1e9+7;
int s[N];
void solve()
{
	s[1]=1;
	for(int i=2;i<=N;i++)
	{
		if(i%2) s[i]=s[i-1];
		else
			s[i]=(s[i-1]+s[i/2])%mod;
	}
}
int main()
{
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);
	int n;
	solve();
	while(~scanf("%d",&n))
	printf("%d\n",s[n]);
	return 0;
}

找规律  

I  难复杂不谈

J

N 级的台阶,你一开始在底部,每次可以向上迈最多K 级台阶(最少1 级),问到达第N 级
台阶有多少种不同方式。
输入
多组输入,两个正整数N(N ≤ 1000),K(K ≤ 100)。
输出
一个正整数,为不同方式数,由于答案可能很大,你需要输出ans mod 100003 后的结果。

#include<cstdio>
#include<cstring>
 
int a[1000+10];
int main()
{
    int n,k;
	while(~scanf("%d%d",&n,&k)){
	memset(a,0,sizeof(a));
	a[0]=1;
	for(int i=1;i<=1000;i++){
	    for(int j=1;j<=k&&(i-j)>=0;j++){
		a[i]+=a[i-j];
		a[i]%=100003;
	    }
	}
	printf("%d\n",a[n]);
	}
    return 0;
 }

K 学着去用栈和队列,stl: map,vector ,set,pair

猜你喜欢

转载自blog.csdn.net/cgmm2333/article/details/81393580
今日推荐