(以上题目出自_rqy两年前)

#A:桶哥的问题——买桶【链接】

【题目描述】

桶哥要买一些全家桶。他有a元钱,而每个桶要花b元钱。他能不能买到c个桶?

【输入格式】

一行三个整数a, b, c

【输出格式】

Yes或No

【输入样例#1】                    【输出样例#1】

26 4 5                                    Yes

【输入样例#2】                    【输出样例#2】

3 4 5                                        No


显然这道题很很很简单的了,然后数据好像也没有需要特判的(好像有些人特判然后就90pts了qwq)

思路就是直接b*c与a比,如果b*c≤a,那么Yes,否则No

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath> using namespace std; long long a,b,c;//唯一注意要开long long int main(){
scanf("%lld%lld%lld",&a,&b,&c);
long long ans = b*c;
if(ans<=a)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return ;
}

没什么大问题,next~


#B:桶哥的问题——送桶【链接】

【题目描述】

桶哥买了n个桶,他要将这些桶送去n个人的家。他送第i个桶需要ai的时间,需要在bi之前送到。桶哥很懒,他想要尽量晚起身去送桶。问他最晚什么时候要去送桶?

桶哥在送完一个桶之后可以紧接着去送另一个桶。

【输入格式】

一行一个整数n,以下n行每行两个整数表示ai,bi。

【输出格式】

一行一个整数,表示桶哥最晚什么时候起身。

【输入样例】                              【输出样例】

4                                                    2
1 6
2 7
2 8
1 7


40pts-错误思路:把所有ai加起来sum(ai),然后找到一个最大的bi,用bi(max)-sum(ai)可以得40pts;

90pts-错误思路:计算每个ai与bi的差值,以及bi(max)-sum(ai),取min,可以骗到90pts;

100pts-正确思路:
对所有的桶按照bi的大小,从小到大排序(对于ai没有要求)(可以用sort解决),然后从1~n for循环:求出当前枚举到的所有ai的和suma,用当前的bi(因为已经排过序了所以当前bi即为当前最大的bi)减去suma(差值暂且叫它kb),取最小的kb即为ans;

90pts代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn=1e6+; using namespace std; int n,minn=1e9+,suma,maxb; struct tong{
int a,b,c;
}t[maxn]; bool cmp(tong x,tong y){
if(x.b==y.b)return x.a>y.a;
else return x.b<y.b;
} int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&t[i].a,&t[i].b);
t[i].c=t[i].b-t[i].a;
if(t[i].c<minn) minn = t[i].c;
if(t[i].b>maxb)maxb=t[i].b;
suma+=t[i].a;
}
int sumc=maxb-suma;
if(sumc<minn)cout<<sumc<<endl;
else cout<<minn<<endl; return ;
}

100pts代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn=1e6+; using namespace std; int n,suma,kb,ans=1e9; struct tong{
int a,b,c;
}t[maxn]; bool cmp(tong x,tong y){
if(x.b==y.b)return x.a>y.a;
else return x.b<y.b;
} int main(){ scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d",&t[i].a,&t[i].b); sort(t+,t+n+,cmp); for(int i=;i<=n;i++){
suma+=t[i].a;
kb=t[i].b-suma;
if(kb<ans) ans=kb;
} cout<<ans<<endl; return ;
}

#C:桶哥的问题——吃桶【链接】

【题目描述】

桶哥的桶没有送完,他还有n个桶。他决定把这些桶吃掉。他的每一个桶两个属性:种类ai和美味值bi。若下标为x,y,z(下标从1开始)的三个桶满足:

x<z且x+y=z-2y且ax=az

那么它们构成一个套餐,会产生

(x+z)*(bx-bz

的价值。问:一共会产生多少价值?

【输入格式】

第一行两个整数n,m,表示共有m种共n个桶。

第二行n个整数表示bi,

第三行n个整数表示ai。

【输出格式】

一行一个整数,表示一共会产生多少价值。由于这个数可能很大,你只需要输出它除以10007的余数。如果答案是负的,请将其加上10007再对10007取余。

【输入样例#1】                【输出样例#1】

5 2                                       23
6 7 8 7 3
1 2 2 1 2

【输入样例#2】                 【输入样例#2】

5 2                                        9974
6 3 8 7 7
1 2 2 1 2

【数据范围】(是个谜)


40~50pts思路:

直接暴力模拟这个过程,时间复杂度大概是O(n)的

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
const int maxn=;
const int mo=; using namespace std; int n,m,xb,ans; struct jgt{
int a,b,xb;
}t[maxn]; int main(){
scanf("%d%d",&n,&m); for(int i=;i<=n;i++)
scanf("%d",&t[i].b); for(int i=;i<=n;i++)
scanf("%d",&t[i].a); for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
xb=i+j*;
if(t[xb].a==t[i].a) ans += ((i+xb)%mo*(t[i].b-t[xb].b)%mo)%mo;
else continue;
}
}
ans%=mo;ans+=mo;ans%=mo;
cout<<ans<<endl;
}

100pts:

化简介个式子,可以知道x与z mod3 同余。那么我们可以不管y了,将这n个桶分为下标mod3余1,mod3余2和mod3余0三种,那么对于组来说:

这个式子可以拆成xbx+zbx-xbz-zbz

对于每一项分开枚举:

xbx:

开两个数组:c1[]和c[],c1[i]用来储存第i种桶的xbx是多少,c[i]用来储存当前枚举到的所有的第i种桶的xbx的和(每个xbx只加一遍)

那么有:

        c1[t[i].a] = (c1[t[i].a]%mod+c[t[i].a]%mod);//存储xbx
//举个例子:假设mod3余1的有:(下标,种类,价值)(1,1,6)(4,1,7)(7,1,2),
那么第一遍:c1[1]=0+0=0;c[1]=0+1*6=6第二遍:
c1[]=+=;c[]=+*=;第三遍:c1[]=+;c[]=+;
这样刚好每个x都加了对应的遍数
c[t[i].a] = (c[t[i].a]%mod+(i%mod)*(t[i].b%mod))%mod; //用来存储xbx的一遍和。另外要注意把c1放在前面而不是c。

zbx:

开两个数组:c2[]和c0[],c2[i]用来储存第i种桶的zbx是多少,c0[i]用来储存当前枚举到的所有的第i种桶的bx和;

(啊我的天不知道怎么表达qwq)

    c2[t[i].a] = (c2[t[i].a]%mod+(i%mod)*(c0[t[i].a])%mod)%mod;//储存zbx
c0[t[i].a] = (c0[t[i].a]%mod+t[i].b)%mod;//用于计算zbx时,储存bx

xbz:

开两个数组:c4[]和c3[],c4[i]用来储存第i种桶的xbz是多少,c3[i]用来储存当前枚举到的所有的第i种桶的下标和;

    c4[t[i].a] = (c4[t[i].a]%mod+c3[t[i].a]%mod*t[i].b%mod)%mod;//存储xbz
c3[t[i].a] = c3[t[i].a]%mod+i%mod;//存储下标的和,用于计算xbz

zbz:

开两个数组:c6[]和c5[],c6[i]用来储存第i种桶的zbz是多少,c5[i]用来储存当前枚举到的所有的第i种桶的个数;

  c6[t[i].a] = (c6[t[i].a]%mod+t[i].b%mod*c5[t[i].a]%mod*i%mod)%mod;//储存zbz
c5[t[i].a] ++;//记录第i种桶个数

嗯-大概吧:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> using namespace std; int read() {
int ans = , c, f = ;
while (!isdigit(c = getchar()))
if (c == '-') f *= -;
do ans = ans * + c - '';
while (isdigit(c = getchar()));
return ans * f;
} const int mod=;
const int maxn=;
int n,m,ans,ans1;
int c[maxn>>], c1[maxn>>], c2[maxn>>], c3[maxn>>],c0[maxn>>],c4[maxn>>];
int c5[maxn>>],c6[maxn>>];
struct jgt{
int a,b;
}t[maxn]; int main(){ scanf("%d%d",&n,&m); for(int i=;i<=n;i++)
scanf("%d",&t[i].b),t[i].b%=mod; for(int i=;i<=n;i++)
scanf("%d",&t[i].a); for(int i=;i<=n;i+=){
c1[t[i].a] = (c1[t[i].a]%mod+c[t[i].a]%mod);//存储xbx
c[t[i].a] = (c[t[i].a]%mod+(i%mod)*(t[i].b%mod))%mod;//用来存储xbx的一遍和
c2[t[i].a] = (c2[t[i].a]%mod+(i%mod)*(c0[t[i].a])%mod)%mod;//储存zbx
c0[t[i].a] = (c0[t[i].a]%mod+t[i].b)%mod;//用于计算zbx时,储存bx
c4[t[i].a] = (c4[t[i].a]%mod+c3[t[i].a]%mod*t[i].b%mod)%mod;//存储xbz
c3[t[i].a] = c3[t[i].a]%mod+i%mod;//存储下标的和,用于计算xbz
c6[t[i].a] = (c6[t[i].a]%mod+t[i].b%mod*c5[t[i].a]%mod*i%mod)%mod;
c5[t[i].a] ++;
} for(int i=;i<=m;i++)
ans = (ans%mod+c1[i]%mod+c2[i]%mod-c4[i]-c6[i])%mod; memset(c, , sizeof(c));memset(c0, , sizeof(c0));
memset(c1, , sizeof(c1));memset(c2, , sizeof(c2));
memset(c4, , sizeof(c4));memset(c3, , sizeof(c3));
memset(c5, , sizeof(c5));memset(c6, , sizeof(c6)); for(int i=;i<=n;i+=){
c1[t[i].a] = (c1[t[i].a]%mod+c[t[i].a]%mod);//存储xbx
c[t[i].a] = (c[t[i].a]%mod+(i%mod)*(t[i].b%mod))%mod;//用来存储xbx的一遍和
c2[t[i].a] = (c2[t[i].a]%mod+(i%mod)*(c0[t[i].a])%mod)%mod;//储存zbx
c0[t[i].a] = (c0[t[i].a]%mod+t[i].b)%mod;//用于计算zbx时,储存bx
c4[t[i].a] = (c4[t[i].a]%mod+c3[t[i].a]%mod*t[i].b%mod)%mod;//存储xbz
c3[t[i].a] = c3[t[i].a]%mod+i%mod;//存储下标的和,用于计算xbz
c6[t[i].a] = (c6[t[i].a]%mod+t[i].b%mod*c5[t[i].a]%mod*i%mod)%mod;
c5[t[i].a] ++;
} for(int i=;i<=m;i++)
ans = (ans%mod+c1[i]%mod+c2[i]%mod-c4[i]-c6[i])%mod; memset(c, , sizeof(c));memset(c0, , sizeof(c0));
memset(c1, , sizeof(c1));memset(c2, , sizeof(c2));
memset(c4, , sizeof(c4));memset(c3, , sizeof(c3));
memset(c5, , sizeof(c5));memset(c6, , sizeof(c6)); for(int i=;i<=n;i+=){
c1[t[i].a] = (c1[t[i].a]%mod+c[t[i].a]%mod);//存储xbx
c[t[i].a] = (c[t[i].a]%mod+(i%mod)*(t[i].b%mod))%mod;//用来存储xbx的一遍和
c2[t[i].a] = (c2[t[i].a]%mod+(i%mod)*(c0[t[i].a])%mod)%mod;//储存zbx
c0[t[i].a] = (c0[t[i].a]%mod+t[i].b)%mod;//用于计算zbx时,储存bx
c4[t[i].a] = (c4[t[i].a]%mod+c3[t[i].a]%mod*t[i].b%mod)%mod;//存储xbz
c3[t[i].a] = c3[t[i].a]%mod+i%mod;//存储下标的和,用于计算xbz
c6[t[i].a] = (c6[t[i].a]%mod+t[i].b%mod*c5[t[i].a]%mod*i%mod)%mod;
c5[t[i].a] ++;
} for(int i=;i<=m;i++)
ans = (ans%mod+c1[i]%mod+c2[i]%mod-c4[i]-c6[i])%mod; printf("%d",(ans+mod)%mod); }

最后,一定要记得:多取模

败在了取mod取得少上qwq

end-

【校内test】桶哥的问题的更多相关文章

  1. 校内题目T2691 桶哥的问题——送桶

    这是一道校内题目,但迷路的蒟蒻们同样被欢迎来此学习QWQ 题目描述: 题目背景 @桶哥本校——皎月pks大佬OrzOrz 买完了桶,桶哥要去送桶. 题目描述 桶哥买了nn个桶, 他要将这些桶送去nn个 ...

  2. 校内题目T2695 桶哥的问题——吃桶

    同T2一样外校蒟蒻可能没看过: 题目描述: 题目背景 @桶哥 桶哥的桶没有送完. 题目描述 桶哥的桶没有送完,他还有n个桶.他决定把这些桶吃掉.他的每一个桶两个属性:种类aia_iai​和美味值bib ...

  3. T2695 桶哥的问题——吃桶

    ~~~~~我~是~真的~忍不了~这个~取模~的~锅~了~~~~~ T2695 桶哥的问题——吃桶 前传 1.T2686 桶哥的问题——买桶 这题真的hin简单,真的 2.T2691 桶哥的问题——送桶 ...

  4. 【洛谷T2695 桶哥的问题——吃桶】

    这是我们团队的一个题目(就是一个_rqy说很好写的题QwQ) 题目背景 @桶哥 这个题目的思路很玄学(性感_rqy在线讲解) 60 Pts 对于前面的六十分,好像很好拿,单纯的打一个模拟 唯一需要注意 ...

  5. 【桶哥的问题——吃桶-简化版】【洛谷p2671】求和

    求和=>[链接] 题目相较起_rqy出的要简单很多,来自noip普及组2015 化简这个式子:x+z=2y,故x与z mod 2同余,因此和桶哥的问题——吃桶一样的思路就可以做出来啦qwq: # ...

  6. T2695 桶哥的问题——吃桶 题解

    校内测试 ------T3 对于这个题,首先想到的应该就是暴力枚举了吧,看看数据范围,60就是白送的啦!(但是我也不知道怎么才20分qwq) 思路分析: 这个题要你求所有套餐的总价值,先看一眼产生套餐 ...

  7. T2695 桶哥的问题——送桶 题解

    校内测试 ------T2 看完这个题,就觉得和贪心那一块的任务调度很像,于是思路就是贪心啦! 蒟蒻的我,也就只能想到用贪心了,但是不知道怎么用qwq 这是我考试当时的思路,数据水骗了80分qwq: ...

  8. 听桶哥讲session和cookie

    首先,cookie和session是什么关系? 他们的关系很简单,利用和被利用的关系. 话说,由于http协议的无状态特性,同一client两个不同的请求之间完全独立,没有很好的办法进行一些数据共享, ...

  9. T2691 桶哥的问题——送桶

    这个题其实不难,就是按照结束时候的顺序从大到小走一遍,能送的就送,如果区间不重合就更新一下 代码: #include<iostream> #include<cstdio> #i ...

随机推荐

  1. 《剑指offer》算法题第一天

    按照个人计划,从今天开始做<剑指offer>上面的算法题,练习平台为牛客网,上面对每道题都有充分的测试实例,感觉还是很不错的.今天下午做了四道题,分别为: 1. 二叉树的深度(书55题) ...

  2. asp.net 怎么上传文件夹啊,不传压缩包!

    ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...

  3. 信息提示框:MessageBox

    一 函数原型及参数 function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer;   1.参数列表    hW ...

  4. make文件基础用法

    参照:https://www.jianshu.com/p/0b2a7cb9a469 创建工作目录,包含一下文件 main.c person.c b.h c.h /*** c.h ***/ //this ...

  5. vue中bus.$on事件被多次绑定

    问题描述:只要页面没有强制刷新,存在组件切换,bus.$on方法会被多次绑定,造成事件多次触发 解决办法一:在每次调用方法前先解绑事件( bus.$off ),然后在重新绑定( bus.$on ) b ...

  6. TCP定时器 之 坚持定时器

    坚持定时器在接收方通告接收窗口为0,阻止发送端继续发送数据时设定. 由于连接接收端的发送窗口通告不可靠(只有数据才会确认,ACK不会确认),如果一个确认丢失了,双方就有可能因为等待对方而使连接终止:接 ...

  7. 2018-2019-2 网络对抗技术 20165232 Exp 9 Web安全基础

    2018-2019-2 网络对抗技术 20165232 Exp 9 Web安全基础 实验任务 本实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分.包括(SQL,XSS,CSRF) ...

  8. redis事务命令

    MULTI开启事务,相当于mysql 的START TRANSACTION; EXEC执行事务 ,相当于mysql的commit; DISCARD放弃执行事务,相当于mysql的rollback; W ...

  9. Kotlin 的函数定义和使用 (译文 转)

    Kotlin 的函数定义和使用 函数声明Kotlin 中的函数使用 fun 关键字声明 fun double(x: Int): Int {}函数用法调用函数使用传统的方法 val result = d ...

  10. Java常见排序和编程算法

    快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比 较,但这种状况并不常见.事实上,快速排序通常明显 ...