A:
int offset[4][2] = { (1, 0), (0, 1), (-1, 0), (0, -1) };
int offset[4][2] = { {1, 0}, {0, 1}, {-1, 0}, {0, -1} };
输入仅有一行,包含一个字串e,是一个仅由左右小括号'(',')',逗号',',以及整数所组成的合法运算式。
输出一行包含一个整数,代表输入所提供的运算式的运算结果
(5,-14)
-14
1≤|e|≤100 e中所有整数的范围为-231≤ x ≤231-1
题目分析:简单分析可以知道,答案就是最后一个出现的数字
#include
using namespace std;
int main()
{
string str;
cin>>str;
int sum=0,flag=0;
for (int i=0;i='0'&&str[i]<='9'||str[i]=='-'){
if (str[i]=='-') flag=1;
else sum=sum*10+str[i]-'0';
}
}
cout<<(flag?(sum*-1):sum)<
B:
沃老师并不会告诉大家分数的排名,但学生间竞争激烈,大家都想知道自己的作文成绩在班上的排名。Amy 8.999999999999999999999999999999999999999990000
Bob 8.9999999999999999999999999999999999999999800
Cat 8.9999999999999999999999999999999999999999899999999
输入共有N + 1行。 第一行有一个正整数N,代表班上有几个人。 接下来N行中的第i行,包含一个字符串namei,以及一个小数scorei,分别代表第i个人的名字以及第i个人的作文得分。
输出总共N行,每行由一个名字和一个小数构成,第i行代表着分数第i高的人的名字以及他的作文得分,代表作文得分的小数必须和输入一模一样,也就是原本末尾有多少零,输出也要有相同数量的零。 若分数相同,则名字字典序比较小的放在前面。
3 Amy 8.999999999999999999999999999999999999999990000 Bob 8.9999999999999999999999999999999999999999800 Cat 8.9999999999999999999999999999999999999999899999999
Amy 8.999999999999999999999999999999999999999990000 Cat 8.9999999999999999999999999999999999999999899999999 Bob 8.9999999999999999999999999999999999999999800
2≤N≤2×105 1≤字串名称的长度≤11 namei由数字及大小写英文字母组成 若i≠j,则namei≠namej 所有名称的长度总和≤6×105 scorei包含三个部分:整数部分,小数点,小数部分 整数部分一定恰只有一个字元(数字'0'〜'9'之一) 一定有小数点('.') 小数部分由'0'〜'9'组成,长度可为0,也可以由字元'0'结尾 若把scorei视为字符串,所有scorei的长度总和≤6×105
题目分析:我们把成绩的末尾0去掉后保存到另一个string里面,然后可以直接根据字符串比较大小。
感觉这里面有一个坑,cmp函数如果你的参数不加引用就T了。
感觉合理的解释是:因为cmp函数被多次调用,不加引用,那么每一次都需要开一个空间,把实参传给形参,赋值过程很耗时。加了引用,就不需要重新赋值过程。
如有错,欢迎评论区给出正确解释,谢谢。
#include
using namespace std;
const int maxn=2*1e5+100;
struct note{
string name,score,pre;
}person[maxn];
void solve(string &s)
{
int first=0;
int len=s.size();
for (int i=len-1;i>=0;i--) {
if (s[i]=='0') first++;
else break;
}
if (firstb.score;
}
int main()
{
int n;
cin>>n;
for (int i=1;i<=n;i++) {
cin>>person[i].name>>person[i].score;
person[i].pre=person[i].score;
solve(person[i].score);
}
sort(person+1,person+1+n,cmp);
for (int i=1;i<=n;i++) {
cout<
C
吉姆是个热爱算法竞赛的小朋友,平常的休闲活动就是刷 牛客网 的题目。
当吉姆刷到 wannafly挑战赛12 F.小H和圣诞树 这题时,颇为震惊,因为这是他第一次在wannafly挑战赛上看到作者提供的解答的时间复杂度的式子里含有根号的题目,于是吉姆就开始在网络上搜寻拥有类似时间复杂度解法的问题,并且看到了以下这题:
给你一个有 N 个点 M 条边的无向简单图,请算算此图中有几个三角形。我们称无序的三个点 x,y,z 为三角形,若且唯若 (x,y)、(y,z)、(x,z) 都是此图上的边。吉姆 想了这个问题七天七夜后,他发现了一件事情:
输入共有 1+L+1+Q 行。 第一行有有两个正整数 M,L。 接下来的 L 行中的第 i 行有两个正整数 degi 和 freqi。 下一行有一个正整数 Q。 最后 Q 行中的第 i 行有两个正整数 ai, bi。
对于每个询问都输出一行包含一个整数,代表式子 Ei 的最小值。题目分析:题目很长,很烦。简单就是确定最优的s使得E最小。
三分来求最优解,结果还需要对俩个极端情况(全是a,全是b)进行比较就好了。
因为是多组查询,我们需要进行一下预处理。
题目说的数据不超过long long,那是表示结果不超过,计算过程中就超过了。
还有更简单的做法!!!
import java.math.BigInteger;
import java.util.Scanner;
public class Main{
final static int maxn=(int) (2*1e5+100);
static BigInteger deg []= new BigInteger[maxn];
static BigInteger freg []= new BigInteger[maxn];
static BigInteger sum_a []= new BigInteger[maxn];
static BigInteger sum_b []= new BigInteger[maxn];
static int a,b;
public static BigInteger f (int pos) {
BigInteger A=sum_a[pos].multiply(BigInteger.valueOf(a));
BigInteger B=sum_b[pos+1].multiply(BigInteger.valueOf(b));
return A.add(B);
}
public static BigInteger min(BigInteger a,BigInteger b) {
if (a.compareTo(b)>0) return b;
else return a;
}
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
BigInteger M=cin.nextBigInteger();
int L=cin.nextInt();
for (int i=1;i<=L;i++) {
deg[i]=cin.nextBigInteger();
freg[i]=cin.nextBigInteger();
}
sum_a[0]=sum_b[L+1]=BigInteger.valueOf(0);
for (int i=1;i<=L;i++) {
sum_a[i]=sum_a[i-1].add(deg[i].multiply(deg[i].multiply(freg[i])));
}
for (int i=L;i>=1;i--) {
sum_b[i]=sum_b[i+1].add(freg[i].multiply(M));
}
int Q=cin.nextInt();
while ((Q--)>0) {
a=cin.nextInt();
b=cin.nextInt();
int left=0,right=L;
while (right-left>1) {
int mid=(right+left)/2;
int mmid=(mid+right)/2;
if (f(mid).compareTo(f(mmid))>0) left=mid;
else right=mmid;
}
BigInteger ans=min(f(left),f(right));
BigInteger res=min(sum_a[L].multiply(BigInteger.valueOf(a)),sum_b[1].multiply(BigInteger.valueOf(b)));
ans=min(ans,res);
System.out.println(ans);
}
cin.close();
}
}