GPLT2017题目

阅览室:
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;
            }
            else
                bok[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;
}
  1. 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 6789
	string 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位多加个亿

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值