题解:
E - 2xN Grid (atcoder.jp)
1.这一题,就是求出第一行与第二行相对应的相同数字的个数,看数据有多大,我们就知道,这道题目,是不可能穷举的。
2.因此,我们需要 找到规律去写它。此题需要用到前缀和算法。
3.我们需要记录数字和他所在的区间。然后根据区间的位置去判断,该数是否在俩列重合,从而,去相加对应的区间。
代码如下:
#include<stdio.h>
#define N 100010
struct node
{
long long x;
long long count;
}a[N][2];
int main()
{
long long l,n1,n2,i,x,y,j,sum,max;
scanf("%lld%lld%lld",&l,&n1,&n2);
for(i=1;i<=n1;i++)
{
scanf("%lld %lld",&a[i][0].x,&a[i][0].count);
a[i][0].count+=a[i-1][0].count;
}
for(i=1;i<=n2;i++)
{
scanf("%lld %lld",&a[i][1].x,&a[i][1].count);
a[i][1].count+=a[i-1][1].count;
}
sum=0;
for(i=1,j=1;i<=n1&&j<=n2;)
{
if(a[i][0].x==a[j][1].x)
{
if(a[i][0].count<a[j][1].count&&a[j-1][1].count<a[i][0].count)
{
if(a[j-1][1].count>a[i-1][0].count)
{
max=a[j-1][1].count;
}
else max=a[i-1][0].count;
sum+=a[i][0].count-max;
i++;
}
else if(a[i][0].count>=a[j][1].count&&a[j][1].count>a[i-1][0].count)
{
if(a[j-1][1].count>a[i-1][0].count)
{
max=a[j-1][1].count;
}
else max=a[i-1][0].count;
sum+=a[j][1].count-max;
j++;
}
else if(a[i][0].count<a[j][1].count)
{
i++;
}
else if(a[i][0].count>=a[j][1].count)
{
j++;
}
}
else if(a[i][0].count<a[j][1].count)
{
i++;
}
else if(a[i][0].count>a[j][1].count) j++;
else
{
i++,j++;
}
}
printf("%lld\n",sum);
}
Problem - B - Codeforces
1.这一题说,只需要比较大小即可,如果它能拿的大,我们可以安排让他先拿完,保证永远比另外一个大
代码:
#include<stdio.h>
#define N 110
int a[N];
int main()
{
int t,n,i,s1,s2;
scanf("%d",&t);
while(t--)
{
s1=s2=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]%2==0) s1+=a[i];
else s2+=a[i];
}
if(s1>s2) puts("YES");
else puts("NO");
}
return 0;
}
Problem - C - Codeforces
1.这道题暴力枚举即可,我们去枚举每一个位置的后一个位置,以及后一个位置每次跳俩次,不相等即可,如果相等就一定是NO,否则是YES
代码:
#include<stdio.h>
int main()
{
int t,i,j,n;
char s[2010];
scanf("%d",&t);
while(t--)
{
int flag=1;
scanf("%d",&n);
scanf("%s",s);
for(i=0;i<n&&flag;i++)
{
for(j=i+1;j<n;j+=2)
{
if(s[i]==s[j])
{
flag=0;
break;
}
}
}
if(flag) puts("YES");
else puts("NO");
}
}
Problem - D - Codeforces
1.利用前缀和思想,去求出所有的前面的总和,然后减去区间的值,最后加上k*(r-l+1)判断奇数偶数即可
代码:
#include<stdio.h>
#define N 200010
int a[N];
int b[N];
int main()
{
int t,n,q,i,l,r,k;
scanf("%d",&t);
while(t--)
{
// sum=0;
b[0]=0;
scanf("%d%d",&n,&q);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i]+b[i-1];
}
for(i=0;i<q;i++)
{
scanf("%d%d%d",&l,&r,&k);
// printf("%d\n",b[n]-(b[r]-b[l-1])+k*(r-l+1));
if((b[n]-(b[r]-b[l-1])+k*(r-l+1))%2) puts("YES");
else puts("NO");
}
}
return 0;
}
我这俩天试着写了很多题,但是提交上去不是TLE就是WA。所以那些题在没有写出来之前就并没有写题解了。
java知识点
java的控制台输入由system.in()完成。
用BufferedReader对象创建后,我们使用read()方法去从控制台读取一个字符,或者用readLine()方法读取一个字符串.
scanner类用于输入
next()获取字符串类似于c语言里面的scanf(“%s”),而nextLine()获取字符串很像gets。
输入int或者float类型的数据,输入之前最好使用hasNextXxx方法进行验证,再使用nextXxx来获取。
输入int时nextInt,float是nextFloat
读写文件是俩个流
FileInputStream和FileOutputStream
读取:
InputStream f=new FileInputStream(“工作目录”)
或者
File f=new File(“”);
InputStream in =new FileInputStream(f)
写入:
OutputStream f = new FileOutputStream(“”)
或者
File f = new File(“”);
OutputStream fout=new FileOutputSTream(f)
一些操作:
close()
write(int w) throws IOExpception{}
指定的字节写到输出流中
write(byte[] w)
把指定数组中w数组的长度字节写到OutputStream中
集合
java中集合框架有主要包括俩种类型的容器,一个是集合类collection,存储元素集合,一个是图Map,存储对应键、值对映射。集合类对应list、Set、Queen、抽象类、具体类(ArrayList、LinkedList、HashSet……)
集合框架包含以下内容:
接口:指代表集合的抽象数据类型。
实现(类)是集合接口的具体实现
算法:实现集合接口的对象里面的方法执行的一些有用的计算
内部类
定义在其他类内部的类称为内部类,也叫嵌套类,包含内部类的类也被称为外部类。
内部类比外部类可以多使用三个修饰符,private、protected、static——外部类不可以使用这三个修饰符。
静态内部类
如果使用static修饰一个内部类,那么这个内部类属于外部类本身,而不属于外部类的某一个对象。使用static修饰的内部类被称为类内部类,也称为静态内部类。
接口里面定义的内部类默认使用public static修饰,接口内部类只能是静态内部类。
如果希望在外部类以外的地方访问内部类,内部类不能使用public访问控制权限,private修饰的内部类只能在外部类内部使用。
局部内部类
把内部类放在方法里面定义,就叫这个内部类为局部内部类,局部内部类仅仅在该方法里面有效。局部内部类不能使用访问控制符和static修饰符修饰。
匿名内部类
匿名内部类只适合创建只需要使用一次的类,匿名内部类不能重复使用。
定义格式如下:
new 实现接口() //或者父类构造器(实参列表)
{
//匿名内部类的类体部分
}
匿名内部类必须继承一个父类或者实现一个接口,但是最多只能继承一个父类和一个接口。
匿名内部类不能是抽象类,系统创建匿名内部类时,会创建匿名内部类的对象。
匿名内部类不能定义构造器,因为匿名内部类没有类名,所以无法定义构造器。但是它可以定义初始化块。
Lambda表达式允许使用更简洁的代码来创建一个抽象方法的接口(这种接口被称为函数式接口)
Lambda表达式语法:
(参数) ->(表达式)
或者
(参数)->{ (表达式);}
可以不声明参数类型,系统会识别,一个参数可以不订阅圆括号,但是多个参数需要。如果只有一个语句则不需要大括号,如果只有一个表达式,那么系统会自动返回,如果不是需要自己指定返回。
如果Lambda表达式的代码块只有一条代码,可以在代码块种使用方法引用和构造器引用。
枚举类
java中枚举类关键字是enum。枚举类不能派生子类。默认是private修饰,也只能是private修饰。
定义:
修饰符 enum 名称
{
……
}
枚举类也可以定义成员变量、方法和构造器,也可以包含抽象方法。
枚举类也可以实现一个或者多个接口。如果枚举类实现接口类里面的方法,那么每个枚举值在调用该方法时都有相同的行为方式。
强制回收内存:system.gc();或者Runtime对象的gc()实例方法Runtime.getRuntime().gc()。
如果想让系统自动回收,使用finalize()方法