阅览室:
L1-043. 阅览室
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。
注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。
输入格式:
输入在第一行给出一个正整数N(<= 10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:
书号([1, 1000]内的整数) 键值(“S”或“E”) 发生时间(hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)
每一天的纪录保证按时间递增的顺序给出。
输出格式:
对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。
输入样例:
3
1 S 08:10
2 S 08:35
1 E 10:00
2 E 13:16
0 S 17:00
0 S 17:00
3 E 08:10
1 S 08:20
2 S 09:00
1 E 09:20
0 E 17:00
输出样例:
2 196
0 0
1 60
题目不难 但是满分也不容易
要是拿满分 就需要考虑到两个S对同一本书一起出现的时候 这个时候在来个这个书的E就会导致这个书的归还问题 是按照前面的还是按照后面的 这里要算按照后面的才能拿满分
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{int sh,sm;
}bok[1010];
int main()
{int t,c=0,time=0;cin>>t;memset(bok,-1,sizeof(bok));while(1){int num,h,m;char o;scanf("%d %c %d:%d",&num,&o,&h,&m);if(num==0){cout<<c<<" ";if(c!=0)cout<<(int)((double)time/c+0.5)<<endl;else cout<<0<<endl;c=0,time=0;t--;memset(bok,-1,sizeof(bok));//必须初始化 一开始忘记写了 就导致前一天借的书没还 影响到了下一天的正常借阅 每天要把借的书清零if(t==0)break;}if(o=='S'){if(bok[num].sh==-1){bok[num].sh=h,bok[num].sm =m;}elsebok[num].sh=h,bok[num].sm = m;//两个S同时出现取后面的}else {if(bok[num].sh!=-1){time += h*60+m-(bok[num].sh*60+bok[num].sm);bok[num].sh = -1;bok[num].sm = -1;c++;}}}return 0;
}
L2-021. 点赞狂魔
时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。然而有这么一种人,他们会通过给自己看到的一切内容点赞来狂刷存在感,这种人就被称为“点赞狂魔”。他们点赞的标签非常分散,无法体现出明显的特性。本题就要求你写个程序,通过统计每个人点赞的不同标签的数量,找出前3名点赞狂魔。
输入格式:
输入在第一行给出一个正整数N(<=100),是待统计的用户数。随后N行,每行列出一位用户的点赞标签。格式为“Name K F1 … FK”,其中 Name 是不超过8个英文小写字母的非空用户名,1<=K<=1000,Fi(i=1, …, K)是特性标签的编号,我们将所有特性标签从1到107编号。数字间以空格分隔。
输出格式:
统计每个人点赞的不同标签的数量,找出数量最大的前3名,在一行中顺序输出他们的用户名,其间以1个空格分隔,且行末不得有多余空格。如果有并列,则输出标签出现次数平均值最小的那个,题目保证这样的用户没有并列。若不足3人,则用“-”补齐缺失,例如“mike jenny -”就表示只有2人。
输入样例:
5
bob 11 101 102 103 104 105 106 107 108 108 107 107
peter 8 1 2 3 4 3 2 5 1
chris 12 1 2 3 4 5 6 7 8 9 1 2 3
john 10 8 7 6 5 4 3 2 1 7 5
jack 9 6 7 8 9 10 11 12 13 14
输出样例:
jack chris john
这道题开始把107
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{string name;int difn,k;double avg;
}p[120];
bool cmp(node a,node b){return a.difn>b.difn||(a.difn==b.difn&&a.avg<b.avg);
}
int main()
{int n;cin>>n;set<int>s;for(int i=1;i<=n;i++){string name;cin>>p[i].name>>p[i].k;int tmp = p[i].k;s.clear();while(tmp--){int t;cin>>t;s.insert(t);}p[i].difn = s.size();p[i].avg = (double)p[i].k/p[i].difn;}sort(p+1,p+1+n,cmp);int lim = min(3,n);for(int i=1;i<=lim;i++){cout<<p[i].name;if(i!=lim)cout<<" ";}int _ = 3-lim;for(int i=1;i<=_;i++){cout<<" -";}cout<<endl;return 0;
}
这道题一开始把1e7当成107做了 不过排序写对了就没问题了 开始没理解什么叫做标签的平均次数
原来就是用所有标签数量÷不同标签的数量。。。 其实就是不同标签个数相同的情况下,总个数小的排在前面,这里可以省略一次浮点运算。
L1-046. 整除光棍
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
翁恺
这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。
提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。
输入格式:
输入在一行中给出一个不以5结尾的正奇数x(< 1000)。
输出格式:
在一行中输出相应的最小的s和n,其间以1个空格分隔。
输入样例:
31
输出样例:
3584229390681 15
import java.math.BigInteger;
import java.util.Scanner;public class Main {public static void main(String[] args) {int x;Scanner sc = new Scanner(System.in);x = sc.nextInt();int tmp = x,cnt=0;String a = "";while(tmp!=0) {tmp/=10;a+="1";}BigInteger fac = new BigInteger(x+"");BigInteger ten = new BigInteger("10");BigInteger ans = new BigInteger(a);ans.pow(cnt);if(ans.compareTo(fac)<0) {ans = ans.multiply(new BigInteger("10")).add(new BigInteger("1"));}while(!(ans.mod(fac).equals(BigInteger.ZERO))) {ans = ans.multiply(ten).add(BigInteger.ONE);}System.out.println(ans.divide(fac)+" "+ans.toString().length());}
}
当然也可以模拟除法 一开始想到模拟除法会用到高精度
但是仔细想一想输入数据不过万 那么我们在做除法的过程中 总是在用比这个数多一位的数在除 所以除数不会太大 也就没必要用高精度 因为这个数总是在用余数做除法
#include<bits/stdc++.h>
using namespace std;
char ans[10010];
int main(){int p=0,len=0,n=1,a;cin>>a;while(++len){if(p||n/a){//not first digit or n mod a ==0 ans[p++] = '0'+n/a; } // cout<<len; n=n%a;if(n==0){ans[p]='\0';printf("%s %d\n",ans,len);break;}n = n*10+1;}return 0;
}
- Read Number in Chinese (25)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output “Fu” first if it is negative. For example, -123456789 is read as “Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu”. Note: zero (“ling”) must be handled correctly according to the Chinese tradition. For example, 100800 is “yi Shi Wan ling ba Bai”.
Input Specification:
Each input file contains one test case, which gives an integer with no more than 9 digits.
Output Specification:
For each test case, print in a line the Chinese way of reading the number. The characters are separated by a space and there must be no extra space at the end of the line.
Sample Input 1:
-123456789
Sample Output 1:
Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
Sample Input 2:
100800
Sample Output 2:
yi Shi Wan ling ba Bai
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
string m[] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string unit[] = {"Shi","Bai","Qian","Wan"};//
int main()
{//1 2345 6789string a,ans;getline(cin,a);int tag=0,c0=0;bool f=0;if(a=="0")cout<<"ling"<<endl;else{if(a[0]=='-')ans+="Fu",tag++;for(;tag<a.length();tag++){int tmp = a[tag]-'0';int dig = a.length()-tag;if(tmp!=0){ if(tag!=0)ans+=" ";if(c0!=0){ans+=m[0],c0=0;ans+=" ",ans+=m[tmp];}else ans+=m[tmp];//unit if(dig==9)ans+=" ",ans+="Yi",f=1;else if(dig==1)continue;else if(dig!=5)ans+=" ",ans+=unit[(dig-2+4)%4];}else {c0++;}if(dig==5){if(c0!=4)ans+=" ",ans+="Wan";//有万则加 无万不加 }}cout<<ans<<endl;} return 0;
}
注意测试点中有0的情况
中文的逻辑是每四位相同单位 第一个5位多加个万 如果前面不都是0 第二个5位多加个亿