D题:用来对比的vector<long long> b不能被初始化大小成n,因为a里面有n个因子,但是这是可能存在遗漏情况的。如果刚好是遇到实际因子远多于n,那么就会在运行过程中出错。

还有一开始写的时候没有考虑到另一边的因子,只有一半肯定出错。

出错代码:

#include<bits/stdc++.h>
using namespace std;
#define sc scanf
#define pt printf
#define maxn 305
#define mll long long
int main()
{
int t; sc("%d",&t);
while(t--)
{
int n,i;
sc("%d",&n);
vector<mll> a(n);
for(i=;i<n;++i) sc("%lld",&a[i]);
sort(a.begin(),a.end());
mll ans = a[]*a[n-];
vector<mll> b(n,-);
int cnt = ;
for(i=;i*1LL*i<=ans;++i)
{
if(ans%i==)
{
b[cnt++]=i;
if(ans/i!=i) b[cnt++]=ans/i;
}
}
sort(b.begin(),b.end());
if(a==b) pt("%lld\n",ans);
else
{
pt("-1\n");
}
}
return ;
}

成功代码:

#include<bits/stdc++.h>
using namespace std;
#define sc scanf
#define pt printf
#define maxn 305
#define mll long long
int main()
{
int t; sc("%d",&t);
while(t--)
{
int n,i;
sc("%d",&n);
vector<mll> a(n);
for(i=;i<n;++i) sc("%lld",&a[i]);
sort(a.begin(),a.end());
mll ans = a[]*a[n-];
vector<mll> b;
for(i=;i*1LL*i<=ans;++i)
{
if(ans%i==)
{
b.push_back(i);
if(ans/i!=i) b.push_back(ans/i);
}
}
sort(b.begin(),b.end());
if(a==b) pt("%lld\n",ans);
else
{
// for(i=0;i<a.size();++i) pt("%lld%c",a[i]," \n"[i==a.size()-1]);
// for(i=0;i<b.size();++i) pt("%lld%c",b[i]," \n"[i==b.size()-1]);
pt("-1\n");
}
}
return ;
}

E题:结果和直接得到结果的值都考虑到了要用long long,但是没想到中间的i被设定成int型,由于n最大是200000,为了计算方便,我把n加了1,用于表示被取得的总次数i*(n-i)超过了int的范围,导致出错。

完整错误句子是:a[i]*=( i*(n-i) ); 我真的,可能一开始下意识地觉得a[i]是long long就没关系了吧。

成功代码:

#include<bits/stdc++.h>
using namespace std;
#define sc scanf
#define pt printf
#define maxn 200005
#define mll long long
#define mod 998244353
mll a[maxn],b[maxn];
int main()
{ mll n,i;
sc("%lld",&n); ++n;
for(i=;i<n;++i)
{
sc("%lld",&a[i]);
a[i]*=( i*(n-i) );
}
sort(a+,a+n);
for(i=;i<n;++i) sc("%lld",&b[i]);
sort(b+,b+n);
mll ans = ;
for(i=;i<n;++i){
ans = ( ans + a[i]%mod*b[n-i]%mod )%mod;
}
pt("%lld\n",ans);
return ;
}

F题:补题过程发现的不足和错误

不足:

(1)代码查错能力,没出正确结果很懵逼,不知道应该从哪里开始查。总觉得是数组越界,结果发现是-1越界而不是靠近正无穷一端越界。

(2)在回顾代码的时候会把自己看懵掉,不知道这个数组具体用来干嘛。

所以要多查多写,命名规范,最重要的是,先整理好思路知道自己在吗干嘛,最好在第一遍的时候把思路写在模块前面,也方便查错。

错误:

(1)促销商品剩余量的位置和促销商品的种类号一开始没对齐,一个从0开始,一个从1开始。

(2)下标越界,有些商品在截至日期之前是没有促销时间的,被我标成了-1.那么我将商品和促销时间联系在一起的时候(把商品标号压入对应促销时间的数组),就会导致运行时错误。

(3)边界处理,在第1000天的时候还是有可能有促销活动的,写成if(i>=1000) continue就会漏掉这个过程。

  思考:能不能不用这个边界判断条件呢?那就要记录ddl之前的最晚促销时间了。

代码F1:

#include <bits/stdc++.h>
#define pt printf
#define sc scanf
#define maxn 1005
#define ull unsigned long long
#define inf 0x3f3f3f3f
using namespace std;
int N,M;
typedef struct ob{
int day;
int type;
}ob;
ob x;
vector<ob> off(maxn,{inf,inf});
int cmp(ob p,ob q)
{
return p.day < q.day ;
}
int can( int ddl ,vector<int> y)
{
//req每次都会复制need数组,来模拟每次购买后还有多少商品需要购买
vector<int> req(y) ;
vector<int> inwhichdayihavesale(N,-);
vector<vector<int> > sale(maxn);
int i,j,len;
for(i=;i<M;++i)
{
//当前时间在截至日期之前
if(off[i].day<=ddl)
{
//更新对应的商品的促销时间,取靠后的时间
inwhichdayihavesale[off[i].type] = max (inwhichdayihavesale[off[i].type],off[i].day) ;
}
else
{
//我们已经对它排过序了,之后的时间肯定大于截至日期
break;
}
}
for(i=;i<N;++i)
{
//pt("inwhichdayihavesale[i] = %d\n",inwhichdayihavesale[i]);
//为什么会有上面这个注释呢?因为不是所有的商品在截至日期之前都有促销活动的
//没有促销活动的商品的促销时间我标记成了-1
if(inwhichdayihavesale[i]!=-)
sale[inwhichdayihavesale[i]].push_back(i);
}
int cur = ;
for(i=;i<=ddl;++i)
{
++cur;
//之前写成了if(i>=1000) 可是第1000天的时候还是有可能有促销活动呀
if(i>) continue;
len = sale[i].size();
for(j=;j<len;++j){
//req[ sale[i][j] ] : 第i天的第j件促销商品的剩余量
if(cur>=req[ sale[i][j] ])
{
cur-= req[ sale[i][j] ];
req[ sale[i][j] ] = ;
}
else
{
req[ sale[i][j] ] -= cur;
cur = ;
break;
}
}
}
int res = accumulate(req.begin(),req.end(),) * ;
//剩下商品需要的钱比已经积攒的钱多,那么就不能在截至日期之前成功买完所有的商品
if(res>cur) return ;
return ;
}
int main()
{
sc("%d%d",&N,&M);
//need代表第i种商品需要购买need[i]个。
vector<int> need(N,);
int i;
for(i=;i<N;++i) sc("%d",&need[i]);
for(i=;i<M;++i)
{
sc("%d%d",&off[i].day,&off[i].type);
//因为我的need是从0开始的,所以商品种类应该减1.
--off[i].type;
}
//根据促销时间先后排序,先发生的在前面
sort(off.begin(),off.end(),cmp);
int l = , r = , ans = , mid;
while(l<=r)
{
mid = (l+r)>> ;
if( can(mid,need) ){
ans = mid ;
r = mid - ;
}else{
l = mid + ;
}
}
pt("%d\n",ans);
return ;
}

代码F2:

#include <bits/stdc++.h>
#define pt printf
#define sc scanf
#define maxn 200005
#define ull unsigned long long
#define inf 0x3f3f3f3f
using namespace std;
int N,M;
typedef struct ob{
int day;
int type;
}ob;
ob x;
vector<ob> off(maxn,{inf,inf});
int cmp(ob p,ob q)
{
return p.day < q.day ;
}
int can( int ddl ,vector<int> y)
{
//req每次都会复制need数组,来模拟每次购买后还有多少商品需要购买
vector<int> req(y) ;
vector<int> inwhichdayihavesale(N,-);
vector<vector<int> > sale(maxn);
int i,j,len;
for(i=;i<M;++i)
{
//当前时间在截至日期之前
if(off[i].day<=ddl)
{
//更新对应的商品的促销时间,取靠后的时间
inwhichdayihavesale[off[i].type] = max (inwhichdayihavesale[off[i].type],off[i].day) ;
}
else
{
//我们已经对它排过序了,之后的时间肯定大于截至日期
break;
}
}
for(i=;i<N;++i)
{
//pt("inwhichdayihavesale[i] = %d\n",inwhichdayihavesale[i]);
//为什么会有上面这个注释呢?因为不是所有的商品在截至日期之前都有促销活动的
//没有促销活动的商品的促销时间我标记成了-1
if(inwhichdayihavesale[i]!=-)
sale[inwhichdayihavesale[i]].push_back(i);
}
int cur = ;
for(i=;i<=ddl;++i)
{
++cur;
//之前写成了if(i>=1000) 可是第1000天的时候还是有可能有促销活动呀
if(i>) continue;
len = sale[i].size();
for(j=;j<len;++j){
//req[ sale[i][j] ] : 第i天的第j件促销商品的剩余量
if(cur>=req[ sale[i][j] ])
{
cur-= req[ sale[i][j] ];
req[ sale[i][j] ] = ;
}
else
{
req[ sale[i][j] ] -= cur;
cur = ;
break;
}
}
}
int res = accumulate(req.begin(),req.end(),) * ;
//剩下商品需要的钱比已经积攒的钱多,那么就不能在截至日期之前成功买完所有的商品
if(res>cur) return ;
return ;
}
int main()
{
sc("%d%d",&N,&M);
//need代表第i种商品需要购买need[i]个。
vector<int> need(N,);
int i;
for(i=;i<N;++i) sc("%d",&need[i]);
for(i=;i<M;++i)
{
sc("%d%d",&off[i].day,&off[i].type);
//因为我的need是从0开始的,所以商品种类应该减1.
--off[i].type;
}
//根据促销时间先后排序,先发生的在前面
sort(off.begin(),off.end(),cmp);
int l = , r = , ans = , mid;
while(l<=r)
{
mid = (l+r)>> ;
if( can(mid,need) ){
ans = mid ;
r = mid - ;
}else{
l = mid + ;
}
}
pt("%d\n",ans);
return ;
}

CF560补题的更多相关文章

  1. hdu5017:补题系列之西安网络赛1011

    补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为m ...

  2. 2017河工大校赛补题CGH and 赛后小结

    网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...

  3. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  4. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  5. [数]补题ver.

    上次补题好像把两次训练混在一起了,总之先按时间顺序补完这一次|ू・ω・` ) HDU-6301 不会的东西不能逃避.jpg 红小豆非常讨厌构造题,因为非常不会,并且非常逃避学习这类题,因为总也搞不清楚 ...

  6. 4.30-5.1cf补题

    //yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...

  7. ICPC南京补题

    由于缺的题目比较多,竟然高达3题,所以再写一篇补题的博客 Lpl and Energy-saving Lamps During tea-drinking, princess, amongst othe ...

  8. 2018 CCPC 桂林站(upc复现赛)补题

    2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...

  9. 【cf补题记录】Codeforces Round #608 (Div. 2)

    比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...

随机推荐

  1. Oracle 汉字占用字节数

    在oracle中一个字符特别是中文字符占几个字节是与字符集有关的.      比如GBK,汉字就会占两个字节,英文1个:如果是UTF-8,汉字一般占3个字节,英文还是1个.但是一般情况下,我们都认为是 ...

  2. shell脚本-巡检内存使用率

    #!/bin/bash # by dreamer Q # 巡检内存脚本 #总内存大小 mem_total=`free -m | sed -n '2p' |awk '{print $2}'` #已使用内 ...

  3. XSLT学习(九)通过JavaScript转化xml

    如果您的浏览器支持 XSLT,那么在浏览器中它可被用来将文档转换为 XHTML. JavaScript 解决方案 在前面的章节,我们已向您讲解如何使用 XSLT 将某个 XML 文档转换为 XHTML ...

  4. 安卓构架组件——向项目添加组件(Adding Components to your Project)

    在开始之前,建议阅读 应用架构指南. Before getting started, we recommend reading the Architecture Components Guide to ...

  5. ios-实现ARC与MRC混编

    选择target -> build phases -> compile sources -> 用ARC的文件将compiler flags设置为:-fobjc-arc,用MRC的文件 ...

  6. Backend事后诸葛亮

    事后诸葛亮 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件想解决初学编程语言的入门困难.定义的不算太清楚,没有仔细地调查用户入门的困难之处. ...

  7. zabbix基础之环境搭建

    zabbix入门 环境部署 安装mysql #安装MySQL,官方的MySQL的repo源地址:http://repo.mysql.com/ #选择指定的MySQL版本,我这里选mysql5.7的版本 ...

  8. 实现多线程的三种方法:Thread、Runnable和Callable

    继承Thread类,重写run()方法 步骤: (1) 定义类继承Thread类 (2) 复写Thread类中的run方法. (3) 调用线程的start方法 (start方法有两种含义:1. 启动多 ...

  9. Altium Designer 19使用

    铺铜之后运行DRC检查弹出警告: Design contains shelved or modified (but not repoured)polygons. The result of DRC w ...

  10. 新装ubantu 18.04(自用)

    1.下载镜像,制作u盘启动,装机,分区(具体的百度) 2.sudo passwd root     给root用户创建密码 3.解压tar.gz文件 sudo tar -zxvf  pycharm.t ...