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. 一波骚操作,我把 SQL 执行效率提高了 10,000,000 倍!

    作者:风过无痕-唐 http://www.cnblogs.com/tangyanbo/p/4462734.html 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表: create  ...

  2. 推荐一个 Java 里面比较牛逼的公众号!

    今天给大家推荐一个牛逼的纯 Java 技术公众号:Java技术栈,作者:栈长. Java程序员.Java爱好者扫码关注吧! 确实牛逼,几十万人关注了,原创文章350+,好友都 3000+ 关注了. 栈 ...

  3. 56-python基础-python3-集合-新建集合

    集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键. 集合支持用in和not in操作符检查成员. 由len()内建函数得到集合的基数(大小). 用 for 循环迭代集合的成员. 但是因为集 ...

  4. IIS 应用池资源定时回收

    方法1: 方法2:

  5. CSS3中的弹性盒子模型

    介绍 在css2当中,存在标准模式下的盒子模型和IE下的怪异盒子模型.这两种方案表示的是一种盒子模型的渲染模式.而在css3当中,新增加了弹性盒子模型,弹性盒子模型是一种新增加的强大的.灵活的布局方案 ...

  6. lambda 分组后的count

    var list = stuList.GroupBy(b => b.PersonalId).Select(g => (new { personalId = g.Key, count = g ...

  7. android&iOS设计分辨率

    --- iPhone --- iPhone SE 1136 * 640 2.0875 iPhone 6 1334 * 750 1.778666666666667 iPhone X 2436 * 112 ...

  8. IDA Pro - 如何得到比较清楚的逆向伪代码

    原文地址:Question about disassembler 简介 这篇文章介绍了如何在不使用插件的IDA Hex-Rays如何得到比较清晰的伪代码.IDA Hex-Rays功能很强大,只要你提供 ...

  9. Ehcahe spring

    Ehcache系列二:Spring缓存注解@Cache使用 标签: CacheableCacheEvictCachePut 2016-06-06 16:37 2235人阅读 评论(0) 收藏 举报   ...

  10. 您的加密USB驱动器是否安全?黑客又是如何攻破的?

    您如何确定您使用的“安全”USB驱动器是否真的安全,并且您存储的数据无法提取?这正是Google公司和中国网络安全研究人员在最近的2018年黑帽美国大会上以艰难的方式攻击加密的USB密钥”的问题. 研 ...