双周赛11

1.重要的话说三遍

这道超级简单的题目没有任何输入。

你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了。

注意每遍占一行,除了每行的回车不能有任何多余字符。

代码

#include <stdio.h>
int main(){
    printf("I'm gonna WIN!\n");
    printf("I'm gonna WIN!\n");
    printf("I'm gonna WIN!\n");
    return 0;
}

2.日期格式化

世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。

输入格式:

输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。

输出格式:

在一行中按照“yyyy-mm-dd”的格式给出年、月、日。

输入样例:

03-15-2017

输出样例:

2017-03-15

思路

用scanf

代码

#include <bits/stdc++.h>
using namespace std;
int main(){
    int y,m,d;
    scanf("%d-%d-%d",&m,&d,&y);
    printf("%d-%02d-%02d",y,m,d);
    return 0;
}

 

3 大笨钟

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。

下面就请你写个程序,根据当前时间替大笨钟敲钟。

输入格式:

输入第一行按照hh:mm的格式给出当前时间。其中hh是小时,在00到23之间;mm是分钟,在00到59之间。

输出格式:

根据当前时间替大笨钟敲钟,即在一行中输出相应数量个Dang。如果不是敲钟期,则输出:

Only hh:mm.  Too early to Dang.

其中hh:mm是输入的时间。

输入样例1:

19:05

输出样例1:

DangDangDangDangDangDangDangDang

输入样例2:

07:05

输出样例2:

Only 07:05.  Too early to Dang.

思路

直接模拟

代码

#include <bits/stdc++.h>
using namespace std;
int main(){
    int h,m;
    scanf("%d:%d",&h,&m);
    if((h>=0 && h<=11) || (h == 12 && m ==0)) printf("Only %02d:%02d.  Too early to Dang.",h,m);
    else{
        int n;
        n = m==0?h-12:h-11;
        for(int i = 0;i<n;i++){
            printf("Dang");
        }
    }
    return 0;
}

 

4 拯救外星人

你的外星人朋友不认得地球上的加减乘除符号,但是会算阶乘 —— 正整数 N 的阶乘记为 “N!”,是从 1 到 N 的连乘积。所以当他不知道“5+7”等于多少时,如果你告诉他等于“12!”,他就写出了“479001600”这个答案。

本题就请你写程序模仿外星人的行为。

输入格式:

输入在一行中给出两个正整数 A 和 B。

输出格式:

在一行中输出 (A+B) 的阶乘。题目保证 (A+B) 的值小于 12。

输入样例:

3 6

输出样例:

362880

 思路

注意longlong

代码

#include<bits/stdc++.h>
using namespace std;
long long jc(int n){
    long long sum = 1;
    for(int i = 1;i<=n;i++){
        sum *= i;
    }
    return sum;
}
int main(){
    int a,b;
    scanf("%d %d",&a,&b);
    cout<<jc(a+b);
    return 0;
}

5.个位数统计

给定一个 k 位整数 N=dk−1​10k−1+⋯+d1​101+d0​ (0≤di​≤9, i=0,⋯,k−1, dk−1​>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。

输入格式:

每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。

输出格式:

对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。

输入样例:

100311

输出样例:

0:2
1:3
3:1

思路

用数组储存

代码 

#include<stdio.h>
#include<math.h>
int main()
{
   char c;
    int pa[10]={0};
    int count,i;
    while((c=getchar())!='\n')
    {
        count=c-'0';
        pa[count]++;
    }
    for(i=0;i<10;i++)
    {
        if(pa[i]>0)
        {
            printf("%d:%d\n",i,pa[i]);
        }
    }
    return 0;
}

6 正整数A+B

题的目标很简单,就是求两个正整数AB的和,其中AB都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。

输入格式:

输入在一行给出AB,其间以空格分开。问题是AB不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。

注意:我们把输入中出现的第1个空格认为是AB的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。

输出格式:

如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?

输入样例1:

123 456

输出样例1:

123 + 456 = 579

输入样例2:

22. 18

输出样例2:

? + 18 = ?

输入样例3:

-100 blabla bla...33

输出样例3:

? + ? = ?

 思路

先判断是否为正整数,是则算,不是就输出“?”。

代码

using namespace std;

int check(char *s)//判断是否是正整数,是则返回num,不是则返回-1
{
    int sum=0;
    for(int i=0;i<strlen(s);i++)
    {
        if(s[i]>='0'&&s[i]<='9')
            sum=sum*10+s[i]-'0';
        else 
            return -1;
    }
    if(sum>=1&&sum<=1000)
        return sum;
    else
        return -1;
}
    int main()
{
    char a[10000],b[10000];//录入A和B
    cin>>a;
    getchar();
    cin.getline(b,10000);
    int p,q;
    p=check(a);
    q=check(b);
    if(p==-1)
        cout<<"? + ";
    else 
        cout<<p<<" + ";
    if(q==-1)
        cout<<"? = ";
    else 
        cout<<q<<" = ";
    if(p==-1||q==-1)
        cout<<"?";
    else
        cout<<p+q;
    return 0;
}

7 打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

 思路

和做过的画图题类似,不过这个是用沙漏指定符号和空格画。

代码

#include<stdio.h>
int main(){
	
	int n;
	char m;
	scanf("%d %c",&n,&m);
	int sum  = 1;
	int a;
	if(n>=7){
	for(int i = 3; ; i+=2){
		sum += 2*i;  
		if(sum>n){
			break;
		}
		a = sum;  
	}
	int b = (a-1)/2;
	int c = 0;
	int i  = 3;
	while(1){
		c+=i;
		if(c==b){
			break;
		}
		i+=2;  
	}

	int x = i,y = i;
	int k = 0;
	while(x>0){
		for(int j = 0;j<k;j++){
		printf(" ");
	}
	for(int j = 0;j<x;j++){
		printf("%c",m);
	}

	printf("\n");
	x-=2; 
	k++;  //每打印完一行就多一个空格 
}
	int z = 3; 
	k-=2;  
	while(z<=y){
		for(int j = 0;j<k;j++){
			printf(" ");
		}
		for(int i = 0;i<z;i++){
		
		printf("%c",m);
	}
	printf("\n");
		z+=2;
		k--;
	}
	int cnt = n-a;
	printf("%d",cnt);
}
 	if(n<7){
 		if(n>0){
 		printf("%c\n",m);
 		printf("%d",n-1);
 	}
 	if(n == 0){
 		printf("1");
	 }
	 }
	return 0;
}

8 机工士姆斯塔迪奥

在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。

你需要处理这个副本其中的一个机制:N×M 大小的地图被拆分为了 N×M 个 1×1 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家不能站在释放技能的方格上,否则就会被击中而失败。

给定 BOSS 所有释放技能的行或列信息,请你计算出最后有多少个格子是安全的。

输入格式:

输入第一行是三个整数 N,M,Q (1≤N×M≤105,0≤Q≤1000),表示地图为 N 行 M 列大小以及选择的行/列数量。

接下来 Q 行,每行两个数 Ti​,Ci​,其中 Ti​=0 表示 BOSS 选择的是一整行,Ti​=1 表示选择的是一整列,Ci​ 为选择的行号/列号。行和列的编号均从 1 开始。

输出格式:

输出一个数,表示安全格子的数量。

输入样例:

5 5 3
0 2
0 4
1 3

输出样例:

12

 思路

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N], b[N];
int sa, sb;
 
int main()
{
	int n, m,q;
	cin >> n >> m >> q;
	int f, x;
	for (int i = 0; i < q; i++) {
		cin >> f >> x;
		if (f) {
			if (!a[x]) {
				a[x] = 1;
				sa++;
			}
		}
		else{
			if (!b[x]) {
				b[x] = 1;
				sb++;
			}
		}
	}
	cout << (n - sb) * (m - sa);
	return 0;
}

 

9 排座位

布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。

输入格式:

输入第一行给出3个正整数:N(≤100),即前来参宴的宾客总人数,则这些人从1到N编号;M为已知两两宾客之间的关系数;K为查询的条数。随后M行,每行给出一对宾客之间的关系,格式为:宾客1 宾客2 关系,其中关系为1表示是朋友,-1表示是死对头。注意两个人不可能既是朋友又是敌人。最后K行,每行给出一对需要查询的宾客编号。

这里假设朋友的朋友也是朋友。但敌人的敌人并不一定就是朋友,朋友的敌人也不一定是敌人。只有单纯直接的敌对关系才是绝对不能同席的。

输出格式:

对每个查询输出一行结果:如果两位宾客之间是朋友,且没有敌对关系,则输出No problem;如果他们之间并不是朋友,但也不敌对,则输出OK;如果他们之间有敌对,然而也有共同的朋友,则输出OK but...;如果他们之间只有敌对关系,则输出No way

输入样例:

7 8 4
5 6 1
2 7 -1
1 3 1
3 4 1
6 7 -1
1 2 1
1 4 1
2 3 -1
3 4
5 7
2 3
7 2

输出样例:

No problem
OK
OK but...
No way

思路

用图储存+dp

代码

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

int f[110];
int e[110][110];
int getf(int v)
{
    if(f[v]==v)
        return v;
    f[v]=getf(f[v]);
    return f[v];
}

void marge(int a,int b)
{
    int t1,t2;
    t1=getf(a);
    t2=getf(b);
    if(t1!=t2)
        f[t2]=t1;
}

int main()
{
    int n,m,k,i,u,v,w;

    memset(e,0,sizeof(0));
    scanf("%d %d %d",&n,&m,&k);
    for(i=1; i<=n; i++)
        f[i]=i;
    for(i=1; i<=m; i++)
    {
        scanf("%d %d %d",&u,&v,&w);
        e[u][v]=e[v][u]=w;
        if(w==1)
         marge(u,v);
    }
    for(i=1; i<=k; i++)
    {
        scanf("%d %d",&u,&v);
        if((getf(u)==getf(v)&&e[u][v]!=-1)||e[u][v]==1)
            printf("No problem\n");
        else if(getf(u)!=getf(v)&&e[u][v]==0)
            printf("OK\n");
        else if(getf(u)==getf(v)&&e[u][v]==-1)
            printf("OK but...\n");
        else if(getf(u)!=getf(v)&&e[u][v]==-1)
            printf("No way\n");
    }
    return 0;
}

10 名人堂与代金券

对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,总评成绩必须达到 60 分及以上,并且有另加福利:总评分在 [G, 100] 区间内者,可以得到 50 元 PAT 代金券;在 [60, G) 区间内者,可以得到 20 元PAT代金券。全国考点通用,一年有效。同时任课老师还会把总评成绩前 K 名的学生列入课程“名人堂”。本题就请你编写程序,帮助老师列出名人堂的学生,并统计一共发出了面值多少元的 PAT 代金券。

输入格式:

输入在第一行给出 3 个整数,分别是 N(不超过 10 000 的正整数,为学生总数)、G(在 (60,100) 区间内的整数,为题面中描述的代金券等级分界线)、K(不超过 100 且不超过 N 的正整数,为进入名人堂的最低名次)。接下来 N 行,每行给出一位学生的账号(长度不超过15位、不带空格的字符串)和总评成绩(区间 [0, 100] 内的整数),其间以空格分隔。题目保证没有重复的账号。

输出格式:

首先在一行中输出发出的 PAT 代金券的总面值。然后按总评成绩非升序输出进入名人堂的学生的名次、账号和成绩,其间以 1 个空格分隔。需要注意的是:成绩相同的学生享有并列的排名,排名并列时,按账号的字母序升序输出。

输入样例:

10 80 5
cy@zju.edu.cn 78
cy@pat-edu.com 87
1001@qq.com 65
uh-oh@163.com 96
test@126.com 39
anyone@qq.com 87
zoe@mit.edu 80
jack@ucla.edu 88
bob@cmu.edu 80
ken@163.com 70

输出样例:

360
1 uh-oh@163.com 96
2 jack@ucla.edu 88
3 anyone@qq.com 87
3 cy@pat-edu.com 87
5 bob@cmu.edu 80
5 zoe@mit.edu 80

 思路

sort

代码

10 名人堂与代金券
分数 25
作者 陈越
单位 浙江大学
对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,总评成绩必须达到 60 分及以上,并且有另加福利:总评分在 [G, 100] 区间内者,可以得到 50 元 PAT 代金券;在 [60, G) 区间内者,可以得到 20 元PAT代金券。全国考点通用,一年有效。同时任课老师还会把总评成绩前 K 名的学生列入课程“名人堂”。本题就请你编写程序,帮助老师列出名人堂的学生,并统计一共发出了面值多少元的 PAT 代金券。

输入格式:
输入在第一行给出 3 个整数,分别是 N(不超过 10 000 的正整数,为学生总数)、G(在 (60,100) 区间内的整数,为题面中描述的代金券等级分界线)、K(不超过 100 且不超过 N 的正整数,为进入名人堂的最低名次)。接下来 N 行,每行给出一位学生的账号(长度不超过15位、不带空格的字符串)和总评成绩(区间 [0, 100] 内的整数),其间以空格分隔。题目保证没有重复的账号。

输出格式:
首先在一行中输出发出的 PAT 代金券的总面值。然后按总评成绩非升序输出进入名人堂的学生的名次、账号和成绩,其间以 1 个空格分隔。需要注意的是:成绩相同的学生享有并列的排名,排名并列时,按账号的字母序升序输出。

输入样例:
10 80 5
cy@zju.edu.cn 78
cy@pat-edu.com 87
1001@qq.com 65
uh-oh@163.com 96
test@126.com 39
anyone@qq.com 87
zoe@mit.edu 80
jack@ucla.edu 88
bob@cmu.edu 80
ken@163.com 70
输出样例:
360
1 uh-oh@163.com 96
2 jack@ucla.edu 88
3 anyone@qq.com 87
3 cy@pat-edu.com 87
5 bob@cmu.edu 80
5 zoe@mit.edu 80

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值