Coduck模拟三
T1:数字对应
思路:用MAP通标即可:
代码:
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
long long n,a[100005],b[100005],cnt=1;
map<long long,bool> v;
map<long long,long long> m;
int main(){//freopen("digit.in","r",stdin);//freopen("digit.out","w",stdout);cin>>n;for(long long i=1;i<=n;i++){cin>>a[i];int t=a[i];v[t]=1;}for(long long i=1;i<=n;i++){if(m.count(a[i])==0){while(v.count(cnt)){cnt++;}v[cnt]=1;m[a[i]]=cnt;}b[i]=m[a[i]];}for(int i=1;i<=n;i++){cout<<b[i]<<" ";}return 0;
}
T2:技能学习
状况:考试时只写了三种特殊情况,已补题
代码:
#include<iostream>
#include <algorithm>
#include <cstdio>
#define ll long long
using namespace std;
ll n, m, k, q, t, f1, n1, f2, n2, ans;
int main() {cin>>n>>m>>k>>q>>t;if (m < k) {printf("0");return 0;}if (n * k > m){n = m / k; m -= n * k;}if (m % n) { f2 = k + m / n + 1;n2 = m % n; }f1 = k + m / n;n1 = n - n2;ans += min(f1 * t, q) * n1;ans += min(f2 * t, q) * n2;printf("%lld", ans);return 0;
}
T3:等于
AC代码(考试爆零了)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
const int maxn = 5e5 + 10;
const int inf = 0x3f3f3f3f;
ll n, ans, num[maxn];
int nxt[maxn][5];
int startpos, endpos;
int main() {cin >> n;memset(nxt, 0x3f, sizeof nxt);for (int i = 1; i <= n; ++i) {cin >> num[i];}ll ret = 1, lst = num[1];for (int i = 2; i <= n; ++i) {if (num[i] == lst)++ret;else {ans += ret * (ret + 1) / 2;ret = 1;lst = num[i];}}ans += ret * (ret + 1) / 2;for (int i = n; i >= 1; --i) {for (int j = 0; j <= 4; ++j)nxt[i][j] = nxt[i + 1][j];nxt[i][num[i] + 2] = i;int maxpos1 = nxt[i][1 + 2], maxpos2 = nxt[i][2 + 2];int minpos1 = nxt[i][-1 + 2], minpos2 = nxt[i][-2 + 2];startpos = max(maxpos2, minpos2);endpos = n + 1;if (startpos != inf && startpos < endpos)ans += endpos - startpos;startpos = max(maxpos1, minpos1);endpos = min(min(maxpos2, minpos2), (int)n + 1);if (startpos != inf && startpos < endpos)ans += endpos - startpos;}cout << ans << '\n';return 0;
}