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−110k−1+⋯+d1101+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
题的目标很简单,就是求两个正整数A
和B
的和,其中A
和B
都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。
输入格式:
输入在一行给出A
和B
,其间以空格分开。问题是A
和B
不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。
注意:我们把输入中出现的第1个空格认为是A
和B
的分隔。题目保证至少存在一个空格,并且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