Blog of CodeJELLOW’S ENGINEERING NOTES
← 返回文章

科林明伦杯

科林明伦杯题解草稿

B 减成一

链接:https://ac.nowcoder.com/acm/contest/5758/B
来源:牛客网

题目描述

存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一。问最少多少次操作,可以让所有数都变成1。
数据保证一定有解。

输入描述:

TEXT
输入t,代表有t组数据。每组数据输入n,代表有n个数。接下来一行输入n个数,数字大小小于1e6。(t<=1000,n<1e5,∑n < 1e6)

输出描述:

TEXT
每组数据输出一个整数代表最少需要操作的次数。

输入

TEXT
1
6
1 3 5 2 7 1

输出

TEXT
9

我的代码

TEXT
#include<stdio.h>

int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int array[100000]={0};
		int n,ans=0,num,pre=0;
		scanf("%d",&n);
		for (int i=0;i<n;i++)
		{
			scanf("%d",&array[i]);
			if (i==0)
			{
				ans+=array[i]-1;
			}
			else
			{
				ans+=(array[i-1]>array[i]?0:(array[i]-array[i-1]));
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

C 面积

链接:https://ac.nowcoder.com/acm/contest/5758/C
来源:牛客网

题目描述

如图所示,正方形周围接4个半圆,求图形的面积

输入描述:

TEXT
输入t,代表有t组数据。每组数据输入正整数x,代表正方形的边长。(t<100, x<1000)

输出描述:

TEXT
输出图形面积,并保留2位小数,其中π取3.14。

输入

TEXT
1
1

输出

TEXT
2.57

我的代码

TEXT
#include<stdio.h>

int main()
{
	int t,x;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&x);
		double ans=x*x+3.14*x*x/2;
		printf("%.2f\n",ans);
	}
}

E 赛马

链接:https://ac.nowcoder.com/acm/contest/5758/E
来源:牛客网

题目描述

一天小明与他同学准备赛马,他们每人有n匹马,每匹马有一个固定的战力值,战力值高的马会战胜战力值低的马并赢得比赛。每匹马只能出场比赛一次。小明偷看到了他对手每匹马的出场顺序,小明在更改自己马出场顺序后最多能赢多少场比赛。

输入描述:

TEXT
输入t,代表有t组数据。每组数据输入正整数n,每人的马匹数量。下一行输入n个值a[i],代表小明每匹马的战力值。接下来一行输入n个值b[i],代表对手按顺序出场的每匹马的战力值。(t<=10, n<1000,1<=i<=n,a[i]<1e6,b[i]<1e6)

输出描述:

TEXT
小明在更改马匹出场顺序后,最多能赢的场数。

输入

TEXT
1
3
5 8 8
4 7 10

输出

TEXT
2

我的代码

TEXT
#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,ans=0;
		int a[1001],b[1001];
		scanf("%d",&n);
		for (int i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
		}
		for (int i=0;i<n;i++)
		{
			scanf("%d",&b[i]);
		}
		sort(a,a+n,cmp);
		sort(b,b+n,cmp);
		int k=0,able=0;
		for (int i=0;i<n;i++)
		{
			while(a[k]>b[i]&&k<n)
			{
				able++;
				k++;
			}
			if (able>0)
			{
				able--;
				ans++;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

F 三角形

链接:https://ac.nowcoder.com/acm/contest/5758/F
来源:牛客网

题目描述

小明有一根长度为a的木棒,现在小明想将木棒分为多段(每段木棒长度必须为整数),
使得分隔后的木棍中,取出的任意三段都不能构成三角形,小明想知道木棒最多被分成几段?

输入描述:

TEXT
输入数据的第一行是t,表示数据的组数, 接下来每组数据输入一个a(t<=1000, 1 <= a < 2^64 - 1)

输出描述:

TEXT
对于每组输入样例,打印木棒最多被分为多少段

输入

TEXT
2
1
3

输出

TEXT
1
2

我的代码

TEXT
#include<stdio.h>

int main()
{
	int t,flag=1;
	scanf("%d",&t);
	unsigned long long int dp[50000];
	unsigned long long int sum[50000];
	unsigned long long int k=18446744073709551615ull;
	dp[1]=1ull;
	sum[1]=1;
	dp[2]=1ull;
	sum[2]=sum[1]+dp[2];
	for (int i=3;i<92;i++)
	{
		dp[i]=dp[i-1]+dp[i-2];
		sum[i]=sum[i-1]+dp[i];
		//printf("%llu\n",dp[i])	;
		//printf("%llu\n",sum[i])	;
	}
	
	
	while(t--)
	{
		long long int a;
		scanf("%llu",&a);
		int l=1,r=91,mid;
		while(l<=r)
		{
			mid=(l+r)/2;
			if (sum[mid]>a)
			{
				r=mid-1;
				mid=(l+r)/2;
			}
			else
			{
				l=mid+1;
				mid=(l+r)/2;
			}
		}
		printf("%d\n",mid);
		
	}
	
	return 0;
}

H 直线

链接:https://ac.nowcoder.com/acm/contest/5758/H
来源:牛客网

题目描述

平面上存在n条直线。请问n条直线在平面上最多存在多少交点。

输入描述:

TEXT
输入数据的第一行是t,表示数据的组数(t  < 100), 接下来每组数据输入一个n(1<=n <= 1e15)

输出描述:

TEXT
对于每组输入样例,打印n条直线最多有多少个交点

输入

TEXT
2
1
2

输出

TEXT
0
1
TEXT
#include<stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
char* MultipyBigNumber(char *s,char *p)
{
	int i,j,x,bit1,bit2;
	int len1 = strlen(s);
	int len2 = strlen(p);
	int len3 = len1 + len2;      /*  结果的位数最大应为两个长度相加  */
	char *arr;
 
	arr = (char*)malloc(sizeof(char)*(len3+1));  
	arr[len3] = '\0';
	arr = &arr[len3];
	len1--;
	len2--;
	i = x = 0;
 
	while(i < len3 - 1 || x != 0)
	{
		for(j = 0; j <= i; j++)
		{
			bit1 = len1 - i + j;   
			bit2 = len2 - j;         
			if(bit1 >= 0 && bit2 >= 0)  
				x += (s[bit1] - '0') * (p[bit2] - '0');
		}
		*(--arr) = x % 10 + '0';
		x /= 10;
                i++;
	}
        if(*arr++ == '0')       
		*arr = '\0';
	return --arr;
}
int main()
{
	int n;
	
	scanf("%d",&n);
	while(n--)
	{
		int flag=29;
		long long int k,m,ans;
		char kk[30],mm[30];
		scanf("%lld",&k);
		m=k-1;
		if ((k%2)==0)
		{
			k=k/2;
		}
		else
		{
			m=m/2;
		}
 

	    sprintf(kk, "%lld",k);
	    sprintf(mm, "%lld",m);
		puts(MultipyBigNumber(kk,mm));
		//itoa(k,kk,10);
		//itoa(m,mm,10);
		//ans=k*m; 
		//printf("%s\n%s",kk,mm);
	}
}

J 最大值

链接:https://ac.nowcoder.com/acm/contest/5758/J
来源:牛客网

题目描述

有一个字符串s,对于字符串中一个非前缀子串恰好为字符串的前缀我们称之为ac串。
请问给出一个字符串他的ac串最大长度为多少

输入描述:

TEXT
输入数据第一行是t,表示数据的组数,接下来每组数据输入一个字符串s(t<=10,s<=1e5)

输出描述:

TEXT
输出最大长度

输入

TEXT
2
aaaaa
abacc

输出

TEXT
4
1

说明

TEXT
aaaab的ac串是aaa(2:4)acac的ac串是ac(3:4)
TEXT
#include <iostream>
#include <string>
using namespace std;
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		string s,sub;
		cin>>s;
		int len=s.length(),l=0,r=len-1,mid;
		while(l<=r)
		{
			mid=(l+r)/2;
			sub=s.substr(0,mid);
			if (s.find(sub,1)!=-1)
			{
				l=mid+1;
				mid=(l+r)/2;
			}
			else
			{
				r=mid-1;
				mid=(l+r)/2;
			}
		}
		sub=s.substr(0,mid);
		printf("%d\n",sub.length());
	}
	return 0;
}

A 最大点对符

链接:https://ac.nowcoder.com/acm/contest/5758/A
来源:牛客网

题目描述

这里有一棵树,每个点和每条边都存在一个价值。对于树上点对的价值,包括点对的起点和终点以及路径上边权值之和,不包括路径上其他点值。
求这颗树上最大的点对价值为多少。点对至少需要两个点。

输入描述:

TEXT
输入t,代表有t组样例。每组样例第一行输入n,代表有n个点。接下来有n-1行,第i行有a[i]和b[i],代表a[i]节点与i节点存在一条边,且边的值为b[i],2<=i<=n。接下来一行有n个值c[j],代表每个节点j的价值,1<=j<=n。(t<=10,n>1,n<1e6,a[i]<i,-500<=b[i]<=500,-500<=c[j]<=500)

输出描述:

TEXT
输出最大的点对价值

输入

TEXT
1
4
1  -2
1   2
1   3
2 -2 3 4

输出

TEXT
12

D 扔硬币

链接:https://ac.nowcoder.com/acm/contest/5758/D
来源:牛客网

题目描述

有n枚硬币,每枚硬币扔出来是正面和反面的概率各占50%。小明同时扔下了n枚硬币后,已知至少有m枚硬币是反面。请问恰好有k枚硬币是正面的概率是多少。

输入描述:

TEXT
输入t,代表有t组数据。每组数据输入一个数n,m,k,代表有n枚硬币,抛出以后至少有m枚是反面的情况下,恰好有k个正面的概率。(t<=1000,n<1e5,m<=1000,k<=n)

输出描述:

TEXT
对于结果是p/q,输出分数取模1e9+7后的结果。

输入

TEXT
1
10 3 5

输出

TEXT
797520667

G 养花

链接:https://ac.nowcoder.com/acm/contest/5758/G
来源:牛客网

题目描述

小明是一个魔法师,他有n棵植物,所有植物排成一排,植物的初始高度为数组h,小明有一些强迫症,他想
让植物的高度都恰好达到k,小明有m瓶药水,但药水分为4种:
1.选择一棵高度为a0的植物变为b0高度的植物
2.选择一棵高度在[a1,a2]区间内的植物变为b1高度的植物
3.选择一棵高度为a1的植物变为[b1, b2]区间内某一高度的植物
4.选择一棵高度在[a1,a2]区间内的植物变为[b1,b2]区间内某一高度的植物
由于每瓶药水有C瓶库存,小明想知道他最多让多少棵植物高度达到k

输入描述:

TEXT
输入数据第一行是t,表示数据的组数,接下来每组数据输入n,m,k,接下来一行输入n个数,分别是每棵植物的高度h[i](1 <= h[i] < k),接下来m行开头的两个数字为op和c表示药水是哪一种和该种药水有几瓶,输入如下若 op=1,则接下来两个整数 a0,b0,意义如上文所述。若 op=2,则接下来三个整数 a1,a2,b1,意义如上文所述。若 op=3,则接下来三个整数 a1,b1,b2,意义如上文所述。若 op=4,则接下来四个整数 a1,a2,b1,b2,意义如上文所述。数据保证,所有 1 <= a0,b0,a1,b1,a2,b2 <= k(t <= 10,n <= 1e4,m <= 300,k <= 100,c <=1e6)

输出描述:

TEXT
输出一个整数,表示最多有多少颗植物能生涨到k。

输入

TEXT
1
5 4 5
1 1 1 1 1
1 3 1 3
1 3 3 2
1 3 2 5
4 1 1 1 4 5

输出

TEXT
4

I 字典序

链接:https://ac.nowcoder.com/acm/contest/5758/I
来源:牛客网

题目描述

小明遇到了一个问题希望你能帮他解决
现在有n个数字排成一列构成数组A,数组A中存在n个数a[i], 其中1<=i<=n。
数组sj为删除数组A中的第j个数后,剩余n-1个数构成的数组,其中1<=j<=n。
小明希望你把s1~sn的数组按照字典序大小排列起来,
若两个数组相等,则认为删除元素编号小的数组字典序更小

输入描述:

TEXT
输入数据第一行是t,表示数据的组数,接下来每组数据输入n,接下来一行一共n个数,a[i]表示数组的第i个数(t<=10,n <= 1e5,a[i] <= 1e9)

输出描述:

TEXT
输出一行n个整数,b1,b2...bn,表示Sb1 < Sb2 < ... < Sbn

输入

TEXT
1
7
1 1 2 1 1 1 2

输出

TEXT
3 7 4 5 6 1 2
通过 RSS 订阅更新 →