HPU暑期第二次常规积分赛

                                                                                                      【A】

思路:大数加法。代码:

#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】 

这个就不给代码来,就是去掉前导0,如果是0000的话只保留一个0;

                                                                                                     【D】 

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

                                                                                                                 【E】 

 下面这道题让我很心累:

代码是如此的简短,唉,当时的我。。。。好渣!代码:

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define LL long long
int main() {
    int T, x;
    cin >> T;
    while(T--) {
        int n;
        int ans = 0;
        cin >> n;
        for(int i = 1; i <= n; ++i) {
            cin >> x;
            ans += x-1;
        }
        cout << ans << "\n";
    }
 
    return 0;
}

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

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

下面给出两个没代码的题,渣渣自己琢磨琢磨!

猜你喜欢

转载自blog.csdn.net/LOOKQAQ/article/details/81427872
今日推荐