2024-2 七年级思维训练2.26
已结束
ACM/ICPC
开始于: 2024-2-26 18:45
2
小时
主持人:
11
因为26号我应该已经回学校了而且接下来一个月我会比较忙来不了几次。每周的训练我会尽量抽出时间出题,有空会写题解,如果我没写题解就搜索题目的名字应该会有人给出题解。我的题解都会放在这里。
题解:
Paint the Numbers
观察题意为了给所有数字涂色显然你先给小的数字涂色更合理。数据范围很小。
定义 vis[105],vis[i]代表数字为i的有几个。
接下来顺序访问vis[1]->vis[100]当你发现当前vis[i]有值也就意味着之前的涂色没有涂给i这个数字,那么ans++同时你应该给1-100中所有j*i涂上颜色
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
vis[a[i]]++;
}
int N=100;
int ans=0;
for(int i=1;i<=N;i++){
if(vis[i]>0){
ans++;
for(int j=1;i*j<=N;j++){
vis[i*j]=0;
}
}
}
cout<<ans<<endl;
Tricky Alchemy
不做解释
Creating the Contest
观察题意首先一个zq序列内部一定是zq序列。其次可以发现"大的zq"序列一定是不重合的,"大的zq"序列指的是[l,r]区间满足题意同时不能往两边延申。
下面的数字指的是位置i
比如说1-7是"大的zq"序列,3-9是"大的zq"序列,当他们有重合的时候其实意味着可以从7延申至9。
1-9才是"大的zq"序列而1-7和3-9不是"大的zq"序列。
既然我们已经证明完了"大的zq"序列一定不会重叠那事情就好办了。
你要做的事情是对于位置i找到一个最远位置j满足[i,j)是zq序列,接下来就可以从j开始找了,因为我们已经证明了"大的zq"序列肯定不会重叠
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=0;
for(int i=1;i<=n;i++){
int len=1;
int j;
for(j=i+1;j<=n;j++){
if(a[j-1]<a[j]&&a[j]<=a[j-1]*2){
len++;
}
else{
break;
}
}
//这一段程序两个循环但是时间复杂度其实是O(n)
//因为这n个位置 每个位置只会被访问一次
i=j-1;
ans=max(ans,len);
}
cout<<ans<<endl;
- 状态
- 已结束
- 规则
- ACM/ICPC
- 题目
- 3
- 开始于
- 2024-2-26 18:45
- 结束于
- 2024-2-26 20:45
- 持续时间
- 2 小时
- 主持人
- 参赛人数
- 11