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字节