今天的题目数量较少,但是也能入魂。
Problem A:NEFU1687 保龄球
匹配好对应关系即可。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
int n, q, num;
map<int, int> blq;
int main()
{
//ios::sync_with_stdio(false);
scanf("%d", &n);
//cin>>n;
for(int i=1; i<=n; i++)
{
//cin>>blq[i];
scanf("%d", &num);
blq[num] = i;
}
//cin>>q;
scanf("%d", &q);
int t;
while(q--)
{
scanf("%d", &t);
//cin>>n;
printf("%d\n", blq[t]);
//cout<<blq[n]<<endl;
}
return 0;
}
Problem B:NEFU1678 查字典
说起来那天找字典树的题时还看见这个来着…
#include<bits/stdc++.h>
using namespace std;
int n, m, page;
string str;
map<string, int> dic;
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>str;
cin>>page;
dic[str] = page;
}
cin>>m;
while(m--)
{
cin>>str;
cout<<dic[str]<<endl;
}
return 0;
}
Problem C:NEFU1686 眼红的Medusa
洛谷原题传送门:P1571 眼红的Medusa
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
int n, m;
int kc[100010], tg[100010];
map<int, bool> prize;
int main()
{
ios::sync_with_stdio(false);
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++)
scanf("%d", &kc[i]);
for(int i=1; i<=m; i++)
{
scanf("%d", &tg[i]);
prize[tg[i]] = 1;
}
for(int i=1; i<=n; i++)
if(prize[kc[i]])
printf("%d ", kc[i]);
return 0;
}
Problem D:NEFU1677 指数序列
感谢@果光提供的思路。
掏出万能的 Win10 计算器观察二进制,发现要想满足题目要求,
只需 使二进制所有位都为 1,也就是要 找最高位之前 0 的个数,用一个数进行补充。
首先题目中的数据给的就是二进制位数,那么现在只需关心两方面:
- ai 的最高位数
- 最高位之前有几个 1(减一下得到 0 的数量)
那么再来看一下数据范围:每个数最大 2e9,肯定不能循环遍历,那就用新讲的 map 存。
map 的 key 保存第几个二进制位(即 ai ),value 保存这位有几个。
这时你会发现题中还有一个重要信息:“这个序列保证单调不降”
这就说明两个同样的位数会产生进位,
解决方案也很简单:map 存储的时候个数只要有 2 个就进位
————————————————
版权声明:本文为CSDN博主「果光」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/csg999/article/details/104354662
话说回来我也是掏的Win10计算器。
#include<bits/stdc++.h>
using namespace std;
int n, t, ans=0, maxn=-1, cnt=0;
long long sum=0;
map<int, int> vis;
int main()
{
//ios::sync_with_stdio(false);
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
scanf("%d", &t);
vis[t]++;
maxn = max(t, maxn);
if(vis[t]==2)
{
for(int i=t; vis[i]==2; i++)
{
vis[i] -= 2;
vis[i+1]++;
}
}
}
for(map<int, int>::iterator i=vis.begin(); i!=vis.end(); i++)
{
if(i->second!=0)
{
ans++;
maxn = max(maxn, i->first);
}
}
printf("%d", maxn<ans?0:(maxn-ans+1));
return 0;
}