手是真的很生了,也非常的石志乐
- 除了第四题是icpc-reginal的签到~铜水平的题,其他的直接暴力就可以了
- AK是AK了,水准是真的很低了...
- 一想到第五题vector的使用和第三题误把空格打成换行而wa了四五发,就很“哇塞”凹~
- 不过明天就答辩了,报告还没开始写就来水比赛,也真不愧是我了!简直闲云散鹤
- 话不多说,上题解了:
T1:组原成绩
题面
题解
按题目计算,控制格式输出
代码
#include <bits/stdc++.h>
#include <cmath>
using namespace std;
int t,h,e;
double w;
int main()
{
cin >> t >> h >> e;
w = 0.2*t + 0.3*h + 0.5*e;
cout<<floor(w)<<endl;
return 0;
}
T2:报告赋分
题面
题解
分三类讨论,小于16页,大于20页和中间的,3个 if 配输出,具体看代码
代码
#include <bits/stdc++.h>
using namespace std;
int t,a[1010],p[1010];
int main()
{
cin>>t;
for(int i=1; i<=t; i++) {
cin>>a[i]>>p[i];
if(p[i]<16) {
a[i] -= 10;
if(a[i]<=0) cout<<"0"<<endl;
else cout<<a[i]<<endl;
}
else if(p[i]>20) {
p[i] -= 20;
a[i] -= p[i];
if(a[i]<=0) cout<<"0"<<endl;
else cout<<a[i]<<endl;
}
else cout<<a[i]<<endl;
}
return 0;
}
T3:竞争得分
题面
题解
我想的比较麻烦,但是这种做起来错的概率低。通过定义另一个数组求出原来数组的最大值和最小值,保证原序列不受影响,具体实现看代码。
代码
#include <bits/stdc++.h>
#include <cmath>
using namespace std;
int t,a[1010],b[1010];
double w;
int main()
{
cin>>t;
for(int i=1; i<=t; i++) {
cin>>a[i];
b[i] = a[i];
}
sort(b+1,b+1+t);
int minn = b[1];
int maxx = b[t];
for(int i=1; i<=t; i++){
if(a[i]==minn)
cout<<"0"<<" ";
else {
double p = a[i]/1.0;
double k = 100*(p-minn/1.0)/(maxx-minn);
cout<<floor(k)<<" ";
}
}
return 0;
}
T4:小卡与质数2
题面
题解
线性筛+暴力对拍,一般遇到这种题,优先考虑按位操作,注意筛的时候不要筛错了,之前就因为筛出来的质数比1e6小了而WA了一发。这不是白给吗?当然没前面白给的多了...
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
int main()
{
vector<int> vis(N);
auto get_prime = [&] (int n)
{
vector<int> p;
vis[0] = vis[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i]) p.push_back(i);
for (int j = 0; j < (int)p.size() && i * p[j] <= n; j++)
{
vis[i * p[j]] = 1;
if (i % p[j] == 0) break;
}
}
};
get_prime(2e6);
vector<int> ans(N), cnt(25);
for (int i = 1; i <= (int)2e6; i++)
{
int lg = __lg(i);
bitset<25> st(i);
for (int j = 0; j < lg; j++)
{
if (st[j]) ans[i] += cnt[j];
}
if (!vis[i]) cnt[lg]++;
}
for (int i = 1; i <= (int)2e6; i++)
{
int lg = __lg(i);
ans[i] += cnt[lg];
}
auto brute = [&] (int n)
{
int cnt = 0;
for (int i = 0; i < n; i++)
{
int j = n ^ i;
if (!vis[j]) cnt++;
}
return cnt;
};
// for (int i = 1000000; i <= 1000000; i++)
// {
// if (i % 100 == 0) printf("%d ok!\n", i);
// cout << brute(i) << " " << ans[i] << endl;
assert(brute(i) == ans[i]);
// }
int t; scanf("%d", &t);
while (t--)
{
int n; scanf("%d", &n);
printf("%d\n", ans[n]);
}
return 0;
}
T5:萝卜数据库
题面
题解:
直接模拟,但是纯数组会出问题,需要vector遍历且push_back
代码
#include <bits/stdc++.h>
#include <cmath>
#include <vector>
using namespace std;
vector<int> w[1010];
int n,k,op,a[1010],p;
int ymin,ymax,c,v,x;
int main()
{
cin >> n >> k;
for(int i=1; i<=n; i++) {
cin >> op;
if(op==1) {
cin >> p;
for(int j=1; j<=p; j++) {
cin >> c >> v;
w[c].push_back(v);
}
}
if(op==2) {
int cnt = 0;
cin >> x >> ymin >> ymax;
for(unsigned int i = 0; i <= w[c].size()-1; ++i) {
if(w[x][i]<=ymax && w[x][i]>=ymin) cnt++;
}
cout<<cnt<<endl;
}
}
return 0;
}