6.29集训模拟赛3(暴力骗分的一天,嘿嘿)
嘿嘿,今天看啥都是暴力,前三到写的都是暴力(呃......都超时,黄一片),最后一道还爆范围了,呵呵,暴力真是万岁(chedan,qwq)
烦死了
T1李时珍的皮肤衣:
题目描述:
LSZ很皮!LSZ的皮肤衣更皮!
LSZ有很多件神奇的皮肤衣,而且LSZ总是喜欢一次穿上多件皮肤衣(一件套一件,而且一直穿好多天),这些皮肤衣有透明或不透明两种状态,当不透明的皮肤衣吸收了一天的阳光直射后,就会变成透明的皮肤衣,透明的皮肤衣能使阳光照射到里层皮肤衣,而透明的皮肤衣再吸收阳光,会在第二天会变成不透明的皮肤衣,不透明的皮肤衣会阻止阳光照射到里层皮肤衣。
LSZ从某天起(该天算作第1天)穿上N件皮肤衣(刚开始所有皮肤衣都是不透明的),问你最少要经过多少天,LSZ身上的皮肤衣都经历过透明变化?
例如今天(公元2018年6月17日)LSZ穿了3件皮肤衣服,会在公元2018年6月21日3件皮肤衣都会经历过透明变化。
输入格式:
一行,只有一个整数N。
输出格式:
最少的天数(对N取余数)。
样例:
样例输入1
3
样例输出1
2
样例输入2
5
样例输出2
2
数据范围与提示:
20%的数据:N≤15。
60%的数据:N≤107。
100%的数据:N≤1010。
分析:
求规律,发现每一种情况对应的方案数是2(n-1)+1。
3››5=22+1。4››9=23+1。5››17=24+1。.................
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll n; ll ans=1; void quik(ll a,ll k){//快速幂板子,这道题数据范围大的很 while(k){ if(k&1){ ans*=a; } a=(a*a)%n; k>>=1; ans%=n; } }//考试时用的for循环求幂10的十次方跑了六分钟还没跑完qwq。 int main(){ scanf("%lld",&n); quik(2,n-1); //printf("%lld\n",ans); printf("%lld",(ans+1)%n); return 0; }
T2马大嘴的废话
题目描述:
MZH爱说废话,喜爱“水群”,经常被“提走”,管理员对MZH在群里说话进行了限制:
1、只能说小写英文字母。
2、长度不超过20。
即使这样,也不能阻止MZH“水群”,他在限制的条件下也说了成千上万条废话信息,现在已知MZH说过的N条废话信息,接下来MZH要说M条废话信息,请你回答:对于他说的每条废话信息在已知N条废话信息中出现的次数和(如果一条中出现多次,只算一次)。
比如:MZH说过了3条信息
-
adbdb
-
bcde
-
cdbf
-
db
现在说的信息为db,那么信息db在信息1和信息3和信息4出现过,所以答案为3.
输入格式
第一行,一个整数N。
接下来N行,每行一个字符串(只能由小写字母组成),代表MZH说过的N条废话信息。
再接下来一行,一个整数M。
接下来M行,每行一个字符串(只能由小写字母组成),代表当前MZH要说的一条废话信息。
输出格式
共M行,每行输出该废话信息出现的次数和。
样例
样例输入
20
ad
ae
af
ag
ah
ai
aj
ak
al
ads
add
ade
adf
adg
adh
adi
adj
adk
adl
aes
5
b
a
d
ad
s
样例输出
0
20
11
11
2
数据范围与提示
20%的数据:n<=100 , m<=50
60%的数据:n<=10000, m<=500
100%的数据:n<=10000, m<=100000
T3 SSY的队列
题目描述
SSY是班集体育委员,总喜欢把班级同学排成各种奇怪的队形,现在班级里有N个身高互不相同的同学,请你求出这N个人的所有排列中任意两个相邻同学的身高差均不为给定整数M的倍数的排列总数。
输入格式
共三行:
第一行为N
第二行为N个不同的整数
第三行为M
输出格式
一行,为符合条件的排列总数(答案对1234567891取余数)。
样例
样例输入1
3
-1 0 1
2
样例输出1
2
样例输入2
4
1 2 3 4
3
样例输出2
12
数据范围与提示
20%的数据:N<=11
70%的数据:N<=15
100%的数据:N<=30,M<=1000。
T4清理牛棚
题目描述
约翰的奶牛们从小娇生惯养。她们无法容忍牛棚里的任何脏东西。约翰发现,如果要使这群有洁癖的奶牛满意,它不得不雇佣她们中的一些来清扫牛棚。
约翰的奶牛中有N(1<=N<=10000)头愿意通过清扫牛棚来挣一些零花钱。由于在某个时段中奶牛们会在牛棚里随时随地地乱扔垃圾,自然地,她们要求在这段时间里,无论什么时候至少要有一头奶牛正在打扫。需要打扫的时段从某一天的第M秒开始,到第E秒结束(0<=M<=E<=86399).注意这里的秒是指时间段而不是时间点。也就是说,每天需要打扫的总时间是E-M+1秒。
约翰已经从每头牛哪里得到了她们愿意接受的工作计划:对于每一头牛,她每天都愿意在第T1..T2秒的时间段内工作(M<=T1<=T2<=E),所要求的报酬是S美元(0<=S<=500000)。与需打扫时段的描述一样,如果一头奶牛愿意工作的时段是每天的第10..20秒,那她总共工作的时间是11秒,而不是10秒。约翰一旦决定雇佣某一头奶牛,就必须付给她全额的工资,而不能只让她工作一段时间,然后再按这段时间在她愿意工作的总时间中所占的百分比来决定她的工资。
现在请你帮约翰决定该雇佣那些奶牛以保持牛棚的清洁,当然,在能让奶牛们满意的前提下,约翰希望使总花费尽量小。
输入格式
第1行:3个正整数N,M,E,用空格隔开。
第2到N+1行:第i+1行给出了编号为i的奶牛的工作计划,即3个用空格隔开的正整数T1,T2,S.
输出格式
输出一个整数,表示约翰需要为牛棚清理工作支付的最少费用。如果清理工作不可能完成,那么输出-1.
样例
样例输入
3 0 4
0 2 3
3 4 2
0 0 1
样例输出
5
数据范围与提示
3头牛。牛棚在第0秒到第4秒之间需要打扫。第1头牛想要在0,1,2秒内工作,为此她要求的报酬是3美元,其余的依此类推。
#include<bits/stdc++.h> using namespace std; const int N=10010; int f[N]; int n,m,E; int ans; struct cow{ int sta; int end; int moy; }e[N]; bool cmp(cow a,cow b){ return a.end<b.end; } int main(){ scanf("%d%d%d",&n,&m,&E); for(int i=1;i<=n;i++){ scanf("%d%d%d",&e[i].sta,&e[i].end,&e[i].moy); } sort(e+1,e+1+n,cmp); memset(f,0x3f,sizeof(f)); ans=f[0]; for(int i=1;i<=n;i++){ if(e[i].sta==m){ f[i]=min(f[i],e[i].moy); continue; } for(int j=i-1;e[j].end>=e[i].sta-1&&j>=1;j--){ f[i]=min(f[i],f[j]+e[i].moy); } if(e[i].end==E){ ans=min(ans,f[i]); } } if(ans==f[0])printf("-1"); else printf("%d",ans); return 0; }