LDUOJ——2020级C语言测试1(顺序选择)

2020级C语言测试1(顺序选择)

原题链接
Cue出题人:Fox 亨亨学长 wsq
排名不分先后,还要感谢所有帮忙验题的聚聚们!

A. Welcome to 610!

题意:

输出输出语句对应的代码

思路:

题目起源于牛客的一道题,注意下转义符即可。

B. Cutele and Chocolate

题意:

问n是否能够被分成k个奇数或k个偶数(分出来的每个数都要大于0)

思路:

题目来源于cf,原题是输出具体方案数。

考虑特殊情况,比如看n能否被分成k个奇数的话,我们可以先分出k-1个1出来,那么这些数都是奇数,这时候只需要判断剩下的数是否大于0(即能否合法)并且是奇数即可。因为前面的1一定是奇数,只需要保证剩下的那个数是大于0的奇数即可。

当n是偶数时,同理可得,我们可以先分出k-1个2出来,那么这些数都是偶数,和为2*(k-1),这时候只需要判断剩下的数是否大于0并且是偶数即可。前面的数一定是偶数,剩下的数大小为n-2 *(k-1),只需要保证这个数是大于0的偶数即可。

关于判断后的组合问题,题目中要求了四种输出,假设n能够被分为k个奇数为事件A,n能够被分为k个偶数为事件B,事件AB都有各自的真假,分别判断即可。AB对应真真、真假、假真、假假,用if语句判断输出。

C. 亨亨一眼题

题意:

给你n * n的格子和三种2 * 2的拼图,问能否存在一种拼法使得 拼好后的格子沿着主对角线对称,拼图可以重复使用。

思路:

题目隐含条件就是拼图可以重复使用,所以只要给出的拼图里有一个拼图满足沿着主对角线对称的话,就可以重复使用那块拼图。

至于如何判断拼图沿着主对角线对称,可以自己想一下喔。

这是要注意的是,给出的拼图都是2 * 2的,而当n是奇数的时候肯定无法拼成,特判一下就可以了。

D. water water water

题意:

第i天可以学习i个知识点,但是如果i是3的倍数的话,有两种选择:一是选择不学习;二是选择学习但是学不会新的知识点并且会忘掉之前学过的一个知识点。问n天内最多能够学会多少个知识点。

思路:

按照常理for是卡不过去的。

考虑最优解,当i是三的倍数的时候,选择不学习是最优的,所以只需要用n天内学会的知识点减去3k(k=0,1,2……)天时学会的知识点。

即1+2+3+……+n-(3+6+9+……);

利用高中等差数列求和公式可以求解。

E. go go go

题意:

给出三次判题的结果,AC的话求罚时。

思路:

if判断即可。最好是一个套一个的判断。

F. Cutele’s Easy Problem!!!

题意:

输出h对应的ACSII值。

思路:

纯签到

G. The Legendary master CoolGuang!

威佐夫博弈

H. Cutele loves circle

题意:

定义Circle number为 如果一个正整数除了最左边以外的所有数字都为0,那么它就是Circle Number 。给一个正整数n, 求一些Circle Number,使得他们的和等于n并且Circle Number的个数最少,从小到大输出这些数。

思路:

因为题目里要求个数最少,所以对于一个整数n来说,分别分离他的每一位是最优解。

比如9875,最优解为5 70 800 9000。

如果不这样分的话,可以考虑把9000拆成8000和1000,这样的和还是n,但是他的个数增加了。

知道这一点后这题就相当于是分离正整数的变式了。

根据Circle number的定义可知0不是Circle number,所以在循环的时候直接特判一下就好。

还有一个坑点就是题目对于输入的描述为每行一个整数,并没有说多少行,所以还是个多组输入问题。

I. Cutele’s stone game

题意:

求不能整除n的第k个数

思路:

如果把数轴分为长度为n的一段一段,那么每一段里面肯定有n-1个数字不能整除n,我们只要查一下第k个数字在哪一段即可。

下面结合代码来说一下。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){
	int t;cin>>t;
	while(t--){
        ll n,k;
        cin>>n>>k;
        ///不能整除n的第k个数
        ll cnt=k/(n-1)+1;
        //每组里面有n-1个数不能整除n,假设当k<n-1的时候为第一组,所以这就是表示第几组。
        ll pos=k%(n-1);
        //上面已经求过第几组了,现在求k在那个组的第几个位置。
       /// cout<<cnt<<" "<<pos<<endl;
        ll sum=n*(cnt-1);
        //求k所在组的上一个组的最后一个数
        if(pos==0) pos=-1;
        //给大家留个小疑问:为什么要这样处理呢
        cout<<sum+pos<<endl;
	}
	return 0;
}

部分题目来源于:cf640

posted @ 2020-10-18 23:50  OvO1  阅读(53)  评论(0编辑  收藏  举报