FJNU2016-2017学年第二十届低年级程序设计竞赛(正式赛) 题解

本文解析了一系列算法竞赛题目,包括快速计算、最优路径选择、任务调度、数字排列等问题,提供了详细的解题思路和代码实现。

Problem A: 跑得比谁都快的IDrandom

众所周知,IDrandom是一个跑得很快的dalao。然而由于种种不可告人的原因,直到今年他才能报名心爱的马拉松。

某个晚上,他和他的妹子在东区体育场夜跑(嘘),东区体育场是一个标准的400米田径场。最初,IDrandom和他的妹子从同一个位置,沿着田径场最内圈同时开始跑步,然而IDrandom巨巨跑得相当快,没过多久IDrandom巨巨就跑远了。

在开始跑步t秒后,IDrandom巨巨突然有了新的想法,他想和妹子在体育场上坐下来聊聊天。望着体育场上的茫茫人海,IDrandom巨巨并没有一眼看到他的妹子在哪。他想知道,如果他现在就停在原地等,他的妹子保持原速度继续沿着跑道跑,那么多久之后他的妹子会跑到他现在的位置。

IDrandom巨巨的跑步速度为v1(m/sec),而他的妹子跑步速度为v2(m/sec),我们假定他们两个人的跑步姿势都足够优美,可以轻松回避开跑道上的其他同学,因此他们的速度保持不变。同时他们始终跑在最内圈的跑道,因此可以认为他们始终跑在400米每圈的跑道上。

Input

本题有多组测试数据

第一行给定一个整数T,表示数据组数

之后会有T行,每行有三个整数t,v1,v2,所代表的意思与题目中相同。

(0< v2 < v1,v1*T<2^30)

Output

根据测试输入,每行输出一个答案,答案精确到小数点后2位。

Sample Input
3
100 20 15
100 20 10
200 20 10

Sample Output
6.67
20.00
0.00

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %I64d\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
                        For(j,m-1) cout<<a[i][j]<<' ';\
                        cout<<a[i][m]<<endl; \
                        } 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
int main()
{
//  freopen("A.in","r",stdin);
//  freopen(".out","w",stdout);
    int T=read();
    while(T--) {
        ll t=read(),v1=read(),v2=read();
        ll c=t*(v1-v2);
        c%=400;
        double p=c/(double)v2;
        printf("%.2lf\n",p);
    } 


    return 0;
}

Problem B: 捧杯

112就是FJNUACM分配的实验室,众所周知的是,里面有很多dalao,比如flag,比如nightlemon。终于有一次,flag凭借着自己的实力夺冠拿到了奖杯。于是他把奖杯带到了实验室。引起了一场腥风血雨。由于除了几个dalao以外其他人都很弱,但是大家又都想捧一下杯,并且都想要自己先捧杯,于是为了先后顺序争论不休。flag最后提出了一个办法就是大家一起捧杯,于是众鶸给了大佬面子,打算一起捧杯。但是大家都想离奖杯近一点,于是都把奖杯朝自己的方向拉,而距离奖杯越远的人用的力气也越大。现在假设每个人用的力气等于他距离奖杯的距离,那么告诉你每个人的坐标和奖杯的坐标,问最后奖杯的受力方向。

Input

第一行给出一个T(T<=100)代表输入数据的组数
接下来对于每一组输入
第一行给出两个整数x0,y0(|x0|,|y0|<=100)代表奖杯所在的位置。
第二行给出一个n(1<=n<=100)代表想捧杯的人数。
接下来n行每一行给出两个整数xi,yi(|xi|,|yi|<=100),代表每个人的坐标

Output

对于每一组测试数据输出一行,包含一个向量(ai,bi)代表最后奖杯所受的合力方向
其中要求|ai|,|bi|为尽可能小的整数。ai,bi之间用一个空格隔开,不能有行末空格

Sample Input
3
0 0
1
0 1
0 0
2
0 2
2 0
0 1
2
0 1
0 2

Sample Output
0 1
1 1
0 1

注意特判向量(0,0),代码不小心覆盖了我就不发了

Problem C: 汪老司机

汪老司机是实验室出了名的老司机,早在大一就拿到了驾照,每年的暑假他都会带家人开车出游,今年的暑假也不例外,汪老司机今年准备带家人去平潭游玩,汪老司机的家离平潭有两条路,每条路都存在n个路段,两条路的n个路段长度都相同,两条路的每个路段都分别存在一个耗油量ai和bi(走完第i个路段,两条路分别耗油ai和bi),因为汪老司机是个熟练的老司机,因此他可以在任意一条路上变道到另外一条路上(只允许在路段的端点变道),虽然是老司机但是他也不能变道超过k次,因为这样容易被警察发现,汪老司机想知道他最少需要耗费多少油才能到达平潭。
注意:当汪老司机在家时,他可以选择两条路的任意一条路作为起点但不消耗他的变道次数

Input

包含多组样例,第一行一个数字T,表示样例的个数
对于每组样例:
第一行两个个数字n,k,分别表示道路路段的个数和能够变道的最多次数
第二行n个数字ai表示第一条道路不同路段的耗油量
第三行n个数字bi表示第二条道路不同路段的耗油量
( T <= 25, 1 <= n <= 10000, 0 <= k <= 10, 0 <= ai <= 1e9, 0 <= bi <= 1e9 )

Output

对于每组样例输出一行一个数字,表示最少的耗费量

Sample Input
1
6 5
1 4 5 8 9 12
2 3 6 7 10 11

Sample Output
36

HINT
汪老司机行走的路线:a1 -> b2 -> a3 -> b4 -> a5 -> b6

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %I64d\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
                        For(j,m-1) cout<<a[i][j]<<' ';\
                        cout<<a[i][m]<<endl; \
                        } 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
ll a[10010]={},b[10010]={},f[10010][20][2];
int main()
{
//  freopen("c.in","r",stdin);
//  freopen(".out","w",stdout);
    int T=read();
    int n,K;
    while(cin>>n>>K) {
        For(i,n) Rep(j,K+1) Rep(l,2) f[i][j][l]=1e15;
        For(i,n) cin>>a[i];
        For(i,n) cin>>b[i];

        f[1][0][0]=a[1],f[1][0][1]=b[1];
        ll ans=1e15;
        Fork(i,2,n) Rep(j,K+1) Rep(l,2) {
            f[i][j][l]=f[i-1][j][l]+((l)?b[i]:a[i]);
            if (j) f[i][j][l]=min(f[i][j][l],f[i-1][j-1][l^1]+((l)?b[i]:a[i]));
            if (i==n) ans=min(ans,f[i][j][l]);
        }
        cout<<ans<<endl;

    }


    return 0;
}

Problem D: 蒟蒻的任务分配

112就是FJNUACM分配的实验室,众所周知的是,里面有很多dalao,比如flag比如nightlemon。但是里面也有一些蒟蒻,比如说IDrandom,这个蒟蒻非常懒惰,总是要拖到最后的时间才去完成任务。但是他的能力是有限的,他至多同时肛两件事,现在,又到了一些事情的deadline了,他必须要完成这些任务,你能计算一下他最短的完成时间么?
但是IDrandom实在是太弱了,他在ti时间做第k件事也是有条件的:
1.如果他在ti时间什么都没有做,那么他可以立即做这件事
2.如果他在ti时间同时在做两件事,那么他绝对不能做这件事
3.如果他在ti时间在做一件事k0,并且k0和k中只要存在任一事件有可容性,
那么它可以立即做当前这件事,否则不能。
现在给出每件事所要花费的时间,以及这件事的可容性,问其最短的完成时间。

Input

第一行给出一个整数t(1<=t<=100),代表数据的组数
对于每一组数据
第一行给出一个整数n(0 < n<=1000),代表要完成的事件数
接下来n行,每行给出两个整数costi,fi(1<=costi<=10,0<=fi<=1)分别代表第i件事
需要耗费的时间和它的可容性,fi为1代表存在可容性,0代表不存在,costi和fi中间用一个空格隔开

Output

对于每一组数据输出一行,包括一个数,代表最短完成时间。

Sample Input
3
2
3 1
4 0
3
4 1
2 0
2 0
3
4 0
3 1
2 1

Sample Output
4
4
5

HINT
对于30%的数据 n<=20.
对于50%的数据 n<=500.
对于100%的数据 n<=1000.

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %I64d\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
                        For(j,m-1) cout<<a[i][j]<<' ';\
                        cout<<a[i][m]<<endl; \
                        } 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
int a[12345];
bitset<10001> b;
int main()
{
//  freopen("D.in","r",stdin);
//  freopen(".out","w",stdout);


    int T=read();
    int n;
    while(cin>>n) {
        int t=0;
        ll noo=0,c=0;
        b=1;
        For(i,n) {
            int p=read(),f=read();
            if (f) a[++t]=p,c+=p;
            else noo+=p;
            b|=(b<<p);
        }
        ll ans=c+noo;
        Rep(i,10001) if (b[i]) {
            ans=min(ans,max((ll)i,noo+c-i));
        }
        cout<<max(ans,noo)<<endl;
    }



    return 0;
}

Problem E: 杂物整理

Time Limit: 1000 MS Memory Limit: 257792 KB
64-bit interger IO format: %lld Java class name: Main

 Submit

“啊。。。。要搬到112了”懒惰的IDrandom说。
因为IDrandom比较懒惰,所以他放在实验室里了很多东西。正因为这样,他搬东西的时候很麻烦,因此他把他所有的东西都放在了若干个大小相等的箱子里搬了过去。但是ID君是一个有强迫症的人,他一定要把箱子堆成若干堆,并遵循以下的规则每当他新开始摆放一堆箱子时,会想要在这一堆摆放尽量多的箱子,并且把这一堆摆成一个自认为完美的三角形。
ID自认为完美的三角形是这么定义的:
假如一共有k层,那么从上往下数的第i层有i个箱子。
比如说,假如ID现在有9个箱子:
摆第一堆的时候摆出一个3层的完美三角形,因为4层的完美三角形需要10个箱子
摆第二堆的时候摆出一个2层的完美三角形,因为刚好剩下3个箱子。
那么他一共摆了两堆。
现在告诉你ID君有多少个箱子要摆,问按照ID君的强迫症,ID君最后会堆出多少个完美的三角形?

Input

第一行输入一个整数T(T<=1000),代表有多少组测试数据
接下来T行,每行代表一组测试数据,对于每组测试数据
输入一个整数n(0< n<=1000),代表ID需要摆放的箱子个数

Output

对于每组测试数据,输出一行,包括一个数c,代表ID君最后堆出的完美三角形的个数

Sample Input
2
9
3

Sample Output
2
1

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %I64d\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
                        For(j,m-1) cout<<a[i][j]<<' ';\
                        cout<<a[i][m]<<endl; \
                        } 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
int a[1000]={};
int main()
{
//  freopen("E.in","r",stdin);
//  freopen(".out","w",stdout);
    int T=read();
    a[0]=0;
    For(i,1000) a[i]=a[i-1]+i;
    int n;
    while(cin>>n) {
        int p=0;
        while(n) {
            int c=upper_bound(a+1,a+1+1000,n)-a-1;
            n-=a[c]; ++p;
        }

        cout<<p<<endl;
    }


    return 0;
}

Problem F: 火柴棒

Flag巨巨的桌上有着非常多的火柴棒。这些火柴棒被摆成了一个十进制数。

每个数字字母用火柴棒的摆法如下图。

这里写图片描述

这个十进制数有n位。某一天,Flag巨巨想把这些火车棒重新排列一次。他喜欢美妙的数字,所以他希望排出的新的数字是一个回文数(如12321,1221都是回文数,1231则不是回文数),并且要恰好用完所有的火柴棒。同时他也喜欢大的数字,所以他希望排出来的新数字要尽量大。现在我们知道火柴棒原本排列的数字,你能求出这些火柴棒能排列出的最大的回文数是什么吗?

Input

第一行给定一个整数T,代表测试数据组数
之后T行每行给定一个n位十进制数(1<=n<=10000),表示火柴棒原本排列的数字。

Output

根据输入数据,每行输出一个十进制数,表示这些火柴棒能排列出的最大的回文数。

Sample Input
3
2
4
8

Sample Output
5
11
171

HINT

每一个数字所需要的火柴棒数量与题目中的图相符。

对于样例输入,原本排列的数是‘2’,总共有5根火柴棒,可以排列出的最大的回文数为5。

不难发现只有5,1,7是用的上的
答案只可能是5,11111111,711171117,1117111这几种

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %I64d\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
                        For(j,m-1) cout<<a[i][j]<<' ';\
                        cout<<a[i][m]<<endl; \
                        } 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
int a[1000]={};
int h[10]={6,2,5,5,4,5,6,3,7,6};
int l[10000],sz=0;
void dfs(int x) {

}
int main()
{
//  freopen("f.in","r",stdin);
    freopen("f.out","w",stdout);
    int T=read();
    int n;
    For(tn,35) {
        int t=tn;
        cout<<t<<' ';
        if (t%2==0) {
            Rep(i,t/2) cout<<'1';cout<<endl;
        }
        else if (t%4==3) {
            Rep(i,t/4) cout<<'1';
            cout<<"7";
            Rep(i,t/4) cout<<'1';
            cout<<endl;
        }
        else if (t==5) puts("5");
        else {
            t-=4;
            cout<<"7";
            Rep(i,t/4-1) cout<<'1';
            cout<<"7";
            Rep(i,t/4-1) cout<<'1';
            cout<<"7";
            cout<<endl;
        }

    }


    return 0;
}

Problem G: PY

flag的两个队友每周都会到不同的地方做不可描述的PY交易,经过长时间的观察,flag发现他们所到的位置排成了一条直线,将他们标记成:1、2、3、4….n,发现他们每次去某个地方做不可描述的PY交易时都会留下一个奇怪的数字,在位置i会留下数字ai,flag坚信这是他两个PY队友交易的暗号,于是经过长期的研究flag发现了一个破解他们PY交易的函数F(i, j),函数可以表示成F(i, j) = ai + aj + | i - j |,只需要计算出最大的F(i, j)就能知道他们PY交易的秘密了。
(2 <= n <= 1e5)

把公式拿出来看看,把i和j分离

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %I64d\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
                        For(j,m-1) cout<<a[i][j]<<' ';\
                        cout<<a[i][m]<<endl; \
                        } 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
#define MAXN (123456)
ll a[MAXN],b[MAXN],c[MAXN];
int main()
{
//  freopen("g.in","r",stdin);
//  freopen(".out","w",stdout);

    int T=read(),n;
    while(cin>>n) {
        For(i,n) {
            a[i]=read();b[i]=a[i]+i,c[i]=-a[i]+i;
        }
        Fork(i,2,n) c[i]=min(c[i],c[i-1]);
        ll p=0;
        Fork(i,2,n) p=max(p,b[i]-c[i-1]);
        cout<<p<<endl;
    }
    return 0;
}

Problem H: 倒水问题

方巨是一个典型强迫症患者。有一天他新买了一个水杯在纠结一个倒水的问题,水杯的体积是Vo,他宿舍有一个烧水壶,烧水壶的体积是V,因为宿舍的烧水壶体积可能比较小,所以他可能需要烧好几次水才能把新买的水杯装满水,于是他在纠结至少要烧多少次水才能把水杯装满水,因为他是一个强迫症患者,所以他不希望最后烧水壶里面有水剩下。请你告诉他,他至少需要烧几次水,以及在烧水次数最少的前提下,最后一次最少需要烧多少体积的水才能保证最后烧水壶没有水剩下。

注意v%v0==0的情况

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007)
#define pb push_back
#define mp make_pair 
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %I64d\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
                        For(j,m-1) cout<<a[i][j]<<' ';\
                        cout<<a[i][m]<<endl; \
                        } 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
    return x*f;
} 
int main()
{
//  freopen("h.in","r",stdin);
//  freopen(".out","w",stdout);

    int T=read();
    ll v0,v;
    while(cin>>v0>>v)
        cout<<(v0/v)+(v0%v>0)<<' '<<(v0%v)+(v0%v==0)*v<<endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值