2021-5-03学+补题

Manacher算法

A - Easy h h h-index

主要是读题的问题,看不懂题目=不会写。题目比较难懂。
题意:输入一行数a0,a1,a2……an。表示索引为0的文章有a0篇,为1的文章有a1篇……。要求最大的h(索引次数),使得h >= a[h]。至少有h篇不少于a[h]

#include <iostream>
using namespace std;
#define ll long long

int main()
{
    
    
	int n;
	ll a[200000+5];
	while(~scanf("%d",&n))
	{
    
    
		int sum=0;
		for(int i=0;i<=n;i++)
		{
    
    
			scanf("%d",&a[i]);
		} 
		for(int h=n;h>=0;h--)
		{
    
    
			sum+=a[h];//从后面开始循环的时候,continue掉的索引次数都是比后来得到的结果的h大的 
			if(sum>=h) 
			{
    
    
				printf("%d\n",h);
				break;
			}
		}
	}
	return 0;
}

B - Higher h h h-index

找规律的题。

在一篇论文上多花时间和开新的论文, a * x求和完全等效,因为 = n,只是拆分方法不同,总合都是a * n。eg: n = 3, a = 2, 拆分为1 1 1, 则基础引用量为2 2 2, trick引用量2 1 0,总效果2+2 2+1 2;拆分为2 1,则基础引用量为4 2(基础部分综合相同),trick引用量1 0(比论文篇数多的情况少),总效果为4+1 2+0,减少。

所以尽可能多写论文,则会增加前面论文的被引用量,肯定是论文数量越多越好,则n个小时写n篇必为最优。确定此策略后,被引用数组为a + n - 1 ~ a的一个等差数列,设答案为B,则B <= a + n - B,B <= (a + n ) / 2,最大值为(a + n ) / 2。

最优⽅案是各花 1 ⼩时写 n 篇论⽂。答案是 ⌊(n+a)/2⌋.

题目第二组样例解释还有迷惑性…比赛的时候大佬猜中结论,一发解决…

原文链接:https://blog.csdn.net/qq_38577732/article/details/90107935

#include<iostream>
using namespace std;
#define ll long long

ll n, a, h;

int main(){
    
    
	while(~scanf("%lld %lld",&n,&a)){
    
    
		h=a+(n-a)/2;
		cout<<h<<endl;
	}
	return 0;
}

F - Sorting

#include <iostream>
#include <algorithm>

using namespace std;
#define ll long long

struct pi
{
    
    
	ll cc;
	ll zi;
	int id;
}p[1000+5];

bool cmp(pi a,pi b)
{
    
    
	ll sum1=a.zi*b.cc;
	ll sum2=b.zi*a.cc;
	if(sum1==sum2) return a.id<b.id;
	return sum1<sum2;
}

int main()
{
    
    
	int n;
	ll a,b,c;
	while(~scanf("%d",&n))
	{
    
    
		for(int i=0;i<n;i++)
		{
    
    
			scanf("%ld %ld %ld",&a,&b,&c);
			p[i].id=(i+1);
			p[i].cc=c;
			p[i].zi=(a+b);
		}
		sort(p,p+n,cmp);
		for(int i=0;i<n-1;i++)
		{
    
    
			printf("%d ",p[i].id);
		}
		printf("%d\n",p[n-1].id);
	}
	return 0;
}

你可以将不等式进行交叉相乘,化简,就可以过了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

struct node{
    
    
	long long int  a,b,c;
	int place;
}nb[1005];

bool cmp(const node &a,const node &b){
    
    
	if(a.c*(b.a+b.b)!=b.c*(a.a+a.b))
		return a.c*(b.a+b.b)>b.c*(a.a+a.b);
	else 
		return a.place<b.place;
}

int main()
{
    
    
	int n;
	while(scanf("%d",&n)!=EOF){
    
    
		int i;
		for(i=0;i<n;i++){
    
    
			scanf("%lld %lld %lld",&nb[i].a,&nb[i].b,&nb[i].c);
			nb[i].place=i+1;
		}
		sort(nb,nb+n,cmp);
		for(i=0;i<n-1;i++){
    
    
			printf("%d ",nb[i].place);
		}
		printf("%d\n",nb[i].place);
	}
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
int main()
{
    
    
	int a;
	long b;
	long long c;
	float d;
	double e;
	long long int f;
	cout<<"int 在64位系统上的字节数为:"<<sizeof(a)<<endl;
	cout<<"long 在64位系统上的字节数为:"<<sizeof(b)<<endl;
	cout<<"long long 在64位系统上的字节数为:"<<sizeof(c)<<endl;
	cout<<"float 在64位系统上的字节数为:"<<sizeof(d)<<endl;
	cout<<"double 在64位系统上的字节数为:"<<sizeof(e)<<endl;
	cout<<"long long int 在64位系统上的字节数为:"<<sizeof(f)<<endl;
}

在使用 printf 的时候需要注意:
表示unsigned long long:

printf(“num = %llu\n”, num);
表示long long int:

printf(“num = %lld\n”, num);

long int long long int
32位 4字节 8字节
64位 8字节 8字节

Guess you like

Origin blog.csdn.net/LXC_007/article/details/116379045