2017 计算机系暑期夏令营机考(华师)

3302. 打印

单点时限: 2.0 sec
内存限制: 256 MB
题目
打印 n 个相同的字符,插入或删除一个字符花费的时间为 x,复制当前整个文本并且粘贴在后面的时间花费为 y,求完成 n 个字符的打印所需的最小花费时间。

输入格式
三个整数 n,x,y (1≤n≤107,1≤x,y≤109),整数之间用一个空格分隔。对于不超过 30% 的数据,n≤105。

输出格式
输出一个整数表示答案。

样例
input

8 1 1

output

4

input

8 1 10

output

8

代码

#include 
#include 
#include 
#include 
#include
#include
using namespace std;
const long long maxn=100000010;
long long dp[maxn]={0};

int main()
{
	int n,x,y,temp;//n为用户数目,m为好友关系
	cin>>n>>x>>y;
	int sum=0;
	dp[1]=x;
	for(int i=2;i<=n;i++)
	{
	    if(i%2==0)
            dp[i]=min(dp[i-1]+x,dp[i/2]+y);
        else
            dp[i]=min(dp[i-1]+x,dp[(i+1)/2]+x+y);
	}
	cout<<dp[n];
	return 0;
}

3303. 1 的个数最多的整数

单点时限: 2.0 sec
内存限制: 256 MB
题目
给定整数 a 和 b,输出区间 [a,b] 中对应二进制表示含 1 的个数最多的整数。如果存在多个解,则输出符合条件的最小的整数。

输入格式
第一行一个整数 T (1≤T≤104),表示问题数。

接下来 T 行,每行两个整数 a,b (0≤a≤b≤263−1)。数据之间用一个空格分隔。

共有两组数据,分别为小数据和大数据,大数据范围如上。对于小数据:T≤10,a≤b≤5⋅106。

输出格式
对于每个问题,输出一行 Case x: y,其中 x 是问题编号,从 1 开始,y 是答案。

样例
input

3
0 14
100 1000
3966869755091699093 4597827455649079876

output

Case 1: 7
Case 2: 511
Case 3: 4035225266123964415

提示
第一个样例数据:a=0,b=14,在 [0,14] 之间含 1 最多的整数为 7(0111),11(1011),13(1101),14(1110),输出最小的整数为 7。
注意,第三组样例不会出现在小数据中。

代码

#include 
#include
using namespace std;
typedef unsigned long long ll;//事先定义可以加快运行速度,他可以表示10的9次方的数

int main()
{
	int t,i;
	cin>>t;
	int sum=0;
	ll a,b;
	for(i=1;i<=t;i++)
	{
	    cin>>a>>b;
	    while((a|(a+1))<=b)
        {
            a=a|(a+1);
        }
	     printf("Case %d: %llu\n", i, a);
	}
	return 0;
}

3304. 不等式

单点时限: 2.0 sec
内存限制: 256 MB
题目
给定 n 个关于整数 X 的不等式,问最多有多少个不等式成立。每个不等式为如下的形式之一:
X < C
X <= C
X = C
X > C
X >= C

输入格式
第一行一个整数 n (1≤n≤200),表示不等式个数。接下来 n 行,每行一个不等式。不等式输入格式为:X sign C,关系运算符 (sign) 左右各有一个空格,C 是整数,0≤C≤109。关系运算符为:<, <=, =, >, >=。对于 35% 的数据,关系运算符只会出现 <= 和 >=。对于 85% 的数据,C≤103。

输出格式
输出最多可以同时成立的不等式个数。

样例
input

4
X = 1
X = 2
X = 3
X > 0

output

2

input

10
X >= 10
X <= 90
X = 1
X > 35
X < 90
X <= 1000
X > 0
X = 900
X < 500
X > 300

output

7

代码
这题肯定要分区间讨论的,如果从最小值+1枚举,就会在18样例超时,所以缩小区间,就是以输入的数字作为区间端点来划分区间,然后对所有断点测试满足多少个不等式。其实这样做是不严谨的,但是还是AC了,暂时没有想到更好的法子。

#include
using namespace std;
struct data{
    string cmp;
    int num;
}a[200];
int n,rst;
string s;
int b[200];
int i;
void jdg(int m)
{
    int tmp=0;
    for(int i=0;i<n;++i){
        if(a[i].cmp=="<"&&m<a[i].num)++tmp;
        else if(a[i].cmp==">"&&m>a[i].num)++tmp;
        else if(a[i].cmp=="="&&m==a[i].num)++tmp;
        else if(a[i].cmp=="<="&&m<=a[i].num)++tmp;
        else if(a[i].cmp==">="&&m>=a[i].num)++tmp;
    }
    rst=max(rst,tmp);
}
int main()
{
    cin>>n;
    for(i=0;i<n;++i){
        cin>>s>>a[i].cmp>>a[i].num;
        b[i]=a[i].num;
    }
    sort(b,b+n);
    jdg(b[0]-1),jdg(b[n-1]+1);
    for(i=0;i<n;++i)jdg(b[i]);
    cout<<rst;
    return 0;
}

3305. 十亿分考

单点时限: 2.0 sec
内存限制: 256 MB
题目
某大学夏令营有一个神奇的考试叫作「十亿分考」,考试总分 q 你是不知道的,你最后得分 p 你也不知道,你只知道你得分的比例(以小数形式),换而言之就是 p÷q。这个大学对待分数非常讲究精确,给你的这个比例,不多不少,恰好精确到小数点后第 15 位。现在要让你猜一猜 p 和 q。

输入格式
一行一个小数 a (0≤a≤1),保证精确到小数点后 15 位。换而言之,若把它当作字符串的话,长度一定是 17。

输出格式
一行两个整数 p (0≤p≤q) 和 q (1≤q≤109),以空格隔开。要满足 pq 四舍五入精确到小数点后第十五位后,与给出的数字相同。请注意总分是不会超过十亿分的(不然怎么叫十亿分考)。万一你对中文没概念的话,十亿就是 109。
如果有多解,输出任意一解。

样例
input

0.333333333333333

output

1 3

代码
暴力枚举肯定超时,好吧不会了,后面都不会了。。。
贴一下一位大佬的解法,人家这暴力很有技巧呀!奉上膝盖

#include
using namespace std;
typedef long long ll;
typedef long double ld;
const int mod=1e9+1;
const ld eps=4e-16;
ld val;
ll up,dn,mid;
int main()
{
    ios::sync_with_stdio(false);
    cin>>val;
    srand(19260817);
    while(1){
        dn=rand()%mod;
        mid=val*dn;
        for(up=mid-10;up<=mid+10;++up){
            if(fabs((ld)up/dn-val)<eps){
                cout<<up/__gcd(up,dn)<<' '<<dn/__gcd(up,dn);
                return 0;
            }
        }
    }
    return 0;
}

后面两题不想做了,想看自己去EOJ瞅瞅~~~

你可能感兴趣的:(考研狗)