【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;
}
下面给出两个没代码的题,渣渣自己琢磨琢磨!