集训队每周一赛2020-03-22(思维+概率+错排)


第四次周赛

  • A 大娃力无穷
    • CodeForces 999A
    • 题解
  • B 二娃晓天地
    • HDU 1465
    • 题解
  • C 三娃钢铁躯
    • CodeForces 1133D
    • 题解
  • D 四娃通控火
    • CodeForces 735D
    • 题解
  • E 五娃操雷雨
    • HDU 5978
    • 题解
  • F 六娃无影踪
    • Gym 100662A
    • 题解

A 大娃力无穷 CodeForces 999A 传送门.
小丑决定今天休息一下,于是他走进了一家游乐场。游乐场里有高矮胖瘦的小盆友。小丑的脑海中不禁浮现出一个画面:在一艘海盗船上坐着n个熊孩子,海盗船周期性地摇摆,每个周期都会在船头或者船尾甩出去一个熊孩子,但是体重大于k的熊孩子会牢牢地抱住船体不能被甩出去。小丑想知道最多能甩出去多少熊孩子。
Input
第一行输入两个整数n和k。1<=n,k<=100
第二行输入n个孩子的体重(小于100)。
Output
输出一个整数——最多能甩出去的孩子数。
Examples
Input
7 5
1 6 4 9 5 8 3
Output
2
Input
5 2
3 1 2 1 3
Output
0
Input
5 100
12 34 55 43 21
Output
5
题解
#include int main() { int n,k,i,j,count=0,a[105]; scanf("%d %d",&n,&k); for(i=0; i=0; i--) { if(a[i]<=k) count++; else break; } if(count/n==2) count=n; printf("%d",count); return 0; }

B 二娃晓天地 传送门.
HDU 1465 WBH垃圾丢错啦,他想知道有多少种丢错垃圾的可能,总共有n袋垃圾和n个垃圾桶,假设wbh全丢错了呢,那么他有多少种丢错的可能,请输出一个值代表wbh有多少种可能全丢错
Input
输入数据包含多个多个测试实例,每个测试实例占用一行,每行包含一个正整数n(1 Output
对于每行输入请输出可能的错误方式的数量,每个实例的输出占用一行。
Sample Input
2
3
Sample Output
1
2
题解
#include #define ll long long ll fun(ll n){ if(n==1)return 0; if(n==2)return 1; return (n-1)*(fun(n-1)+fun(n-2)); } int main(){ ll n,ans; while(scanf("%lld",&n)!=EOF) { ans=fun(n); printf("%lld\n",ans); } return 0; }

C 三娃钢铁躯 CodeForces 1133D 【集训队每周一赛2020-03-22(思维+概率+错排)】传送门
第一行给一个n(<=10^5)
第二行n个数,代表a数组(-109<=ai<=109)
第二行n个数,代表b数组(-109<=bi<=109)
请你找一个最佳的d(可以是一个小数)使得ci = d*ai+bi,ci数组中0的个数尽可能多
Output
输出一个整数,c数组中最多可以有几个0.
Examples
Input
5
1 2 3 4 5
2 4 7 11 3
Output
2
Input
3
13 37 39
1 2 3
Output
2
Input
4
0 0 0 0
1 2 3 4
Output
0
Input
3
1 2 -1
-6 -12 6
Output
3
题解
#include #include using namespace std; mapc; const int N = 2e5+10; int a[N], b[N]; int i,n,maxx=0,ans=0; int main() { cin>>n; for(i=1; i<=n; i++) cin>>a[i]; for(i=1; i<=n; i++) cin>>b[i]; for(i=1; i<=n; i++) { if(a[i] == 0) { if(b[i]==0) ans++; else continue; } else { long double tmp = b[i]*1.0/a[i]; c[tmp]++; maxx = max(maxx,c[tmp]); } } cout<

D 四娃通控火 CodeForces 735D 传送门
Mr. Frog住在一个税收制度很奇怪的国家
如果Mr. Frog的收入为 n (n?≥?2) 元,那么他应该交n的最大的小于n的因子的税
For example,
n=6,交3,
n=25,交5,
n=7,交1
但是Mr. Frog已经身经百战,见得多了,他可以把自己的工资分成任意多份(每份数量为整数)分别按照这个规则缴税来逃税,那么,Mr. Frog最少需要交多少税呢
Input
一行一个整数 n (2?≤?n?≤?2·109) 表示Mr. Frog的收入
Output
一个整数,表示Mr. Frog最少交的钱数
Example
Input
4
Output
2
Input
27
Output
3
Hint
4=2+2
27=3+11+13
Mr. Frog 希望你们多猜想猜想
没有证明的东西在某个范围内还是正确的嘛
闷声发大财,这是最吼的
题解
#include #include #define ll long long int isprime(ll n) { int i; for(i=2; i<=sqrt(n); i++) { if(n%i==0) return 0; } return 1; } int main () { ll i,n,flag=1; while(scanf("%lld",&n)!=EOF) { if(n%2==0) { if(n==2) printf("1\n"); else if(!isprime(n)) printf("2\n"); } else { if(isprime(n)) printf("1\n"); else { if(isprime(n)) printf("1\n"); else if(isprime(n-2)) printf("2\n"); else printf("3\n"); } } } return 0; }

E 五娃操雷雨 HDU 5978 传送门
一个盒子里有一个红球和k个黑球.嘻嘻和哈哈不放回地交替从盒子里拿球, 直到红球被拿出,并且拿到红球的获胜.哈哈是一个长者, 为了给嘻嘻一点人生的经验,他让嘻嘻决定谁先拿.嘻嘻预感到自己先走的话可能会更好,因为他可能第一次就获胜.但如果他第一次拿到的是黑球, 那哈哈获胜的概率就会变大,因为一个黑球被去除掉了.嘻嘻应该让谁先拿才能使自己获胜的概率最大?
Input
多组输入数据( 数据总数小于50)
每组数据含有一个整数k ( 1≤k≤10^5)
Output
对于每组数据, 输出:
1, 如果先拿的有优势
2, 如果后拿的有优势
0, 如果不管谁先谁后, 概率都是一样的
Sample Input
1
2
Sample Output
0
1
题解
#include int main() { int k; while(scanf("%d",&k)!=EOF) { if(k==1) printf("0\n"); else if(k%2==0) printf("1\n"); else printf("0\n"); } return 0; }

F 六娃无影踪 Gym 100662A 传送门
总所周知,小G最宠女友的,而小G的女友最喜欢唱歌,奈何她唱
得实在不咋地~~~ ~~。突然一日,小G女友想开个演唱会(…又
怎么会有观众呢…)。小G只好花钱买点观众,让这些观众去捧
场,唱完给小G女友鼓鼓掌,怎知道观众这东西他有个害羞值,
何为害羞值,若一个观众的害羞值为k,那么这个观众只有在场
上有k个及以上的人鼓掌了,这个观众才会鼓掌(害羞值为0的观
众就意味着等小G女友一唱完他就会鼓掌)。若到场的观众没有
全部都鼓掌,小G女友会感到难堪。小G不想让女友感到难堪,已
知小G已经买了n名观众(不能退货),这些观众都有其特定的害
羞值,为了使到场的所有观众都鼓掌,小G有可能还需要买观众
(额外买的观众,小G可以指定这些观众的害羞值),问:小G至
少还需要买多少观众????
输入描述:
第一行为1个正整数T(1 <= T <= 1000),表示样例数,以下有T
个样例
每个样例包含一个整数非负整数m(m <= 1000)和一个长度为
m+1的数字串S,数字m表示小G已经购买的观众的害羞值范围在
[0,m],m+1的数字串S: 表示害羞值为0的观众买了S[0]位,害
羞值为1的观众买了s[1]位…害羞值为m的观众买了s[m+1]
位,保证s[i]在0~9之间;
输出描述:
对于每个样例输出一行:Case #x: ans,x为样例序号,ans为 小G至少还需要购买的观众数量
示例:
Input
3
4 11111
1 09
5 110011
0 1
Ouput
Case #1: 0
Case #2: 1
Case #3: 2
Case #4: 0
题解
#include int main() { int i,t,m,cas=1,ans,sum; char a[1005]; scanf("%d",&t); while(t--) { ans=0,sum=0; scanf("%d",&m); scanf("%s",&a); for(i=0; i

    推荐阅读