好久都没写博客了,不知不觉暑训都快过半了呢,专心刷题的日子还是很快乐的,今日放假,来赶紧补一发
先从放假前的开始吧,悄悄潜入入门班跟一波榜,回忆起一年前自己似乎还什么都不会呢,感慨万千
A - 这是测试你会不会语言的模拟
思路:典型的模拟暴搜,枚举每个位置,找出最大值即可
/*
Author:Owen_Q
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 30;
int n,m;
int k[maxn][maxn];
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(m==0&&n==0)
{
break;
}
for(int j=0;j<=m+1;j++)
{
k[0][j]=0;
k[n+1][j] = 0;
}
for(int i=1;i<=n;i++)
{
k[i][0] = 0;
for(int j=1;j<=m;j++)
{
scanf("%d",&k[i][j]);
}
k[i][m+1] = 0;
}
int maxk = -10000,maxi = 0,maxj = 0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int sum = k[i+1][j] + k[i-1][j] + k[i][j+1] + k[i][j-1];
if(k[i][j]>0)
{
sum *= (-1);
}
if(sum > maxk)
{
maxk = sum;
maxi = i;
maxj = j;
}
}
}
printf("%d %d %d\n",maxi,maxj,maxk);
}
return 0;
}
B - 这是测试你会不会排序
思路:STL sort函数的运用
/*
Author:Owen_Q
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000;
int n;
int a[maxn],b[maxn];
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
break;
}
int aw=0,bw=0;
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);
sort(b,b+n);
for(int i=0;i<n;i++)
{
if(a[i]>b[i])
{
aw += 2;
}
else if(a[i]<b[i])
{
bw += 2;
}
else
{
aw++;
bw++;
}
}
printf("%d vs %d\n",aw,bw);
}
return 0;
}
C - 进一步排序
思路:一开始考虑会不会是背包,后来发现物品可分割,果断排序,贪心
/*
Author:Owen_Q
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
int v,n;
typedef struct jewellery
{
int p;
int m;
}Jewellery;
Jewellery j[maxn];
bool cmp(const Jewellery a, const Jewellery b)
{
return a.p>b.p;
}
int main()
{
while(scanf("%d",&v)!=EOF)
{
if(v==0)
{
break;
}
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&j[i].p,&j[i].m);
}
sort(j,j+n,cmp);
int sum = 0;
for(int i=0;i<n;i++)
{
if(v>j[i].m)
{
v -= j[i].m;
sum += j[i].p * j[i].m;
}
else
{
sum += v * j[i].p;
break;
}
}
printf("%d\n",sum);
}
return 0;
}
D - 测试你会不会字符串
思路:基础的字符串读取,并转化为十进制数,40min4题确实爽歪歪
/*
Author:Owen_Q
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100;
long long p = 1l;
long long num = 0l;
long long a = 0l;
long long b = 0l;
char in[maxn];
int main()
{
while(scanf("%s",in)!=EOF)
{
p = 1l;
a = 0l;
b = 0l;
int inlen = strlen(in);
for(int i=0;i<inlen;i++)
{
if(in[i] == '-')
{
p *= (-1l);
continue;
}
if(in[i] == ',')
{
continue;
}
a *= 10l;
a += (long long)(in[i] - '0');
}
a *= p;
scanf("%s",in);
p = 1l;
inlen = strlen(in);
for(int i=0;i<inlen;i++)
{
if(in[i] == '-')
{
p *= (-1l);
continue;
}
if(in[i] == ',')
{
continue;
}
b *= 10l;
b += (long long)(in[i] - '0');
}
b *= p;
num = a + b;
printf("%lld\n",num);
}
return 0;
}
E - 这是高中数学向量题
思路:判断凸多边形,终于有点难度了
判断凸多边形的方法有很多,主要有以下几种:
1.角度法:判断每个顶点对应的内角,若均小于180度,则为凸多边形
2.凸包法:计算该多边形的凸包,若凸包对应的顶点数与该多边形相等,则为凸多边形
3.顶点凹凸性法:利用以当前顶点为中心的矢量叉乘或者计算三角形的有符号面积判断多边形的方向以及当前顶点的凹凸性。
4.辛普森面积法:利用待判别的顶点以及前后两个顶点所组成的三角形,利用辛普森公式计算其面积,如果此三角形面积与整个多边形面积符号相同,那么这个顶点是凸的;如果此三角形面积与整个多边形面积符号不同,那么这个顶点是凹的,即整个多边形也是凹多边形。
本题由于知道了顶点公式,当然选择根据顶点相邻边向量(p1p2和p2p3)叉积来判断,若均大于0则为凸多边形
/*
Author:Owen_Q
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1001;
int x[maxn],y[maxn];
int n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
break;
}
bool convex = true;
for(int i=0;i<n;i++)
{
scanf("%d%d",&x[i],&y[i]);
}
int x1=x[0],y1=y[0],x2=x[1],y2=y[1],x3=x[2],y3=y[2];
for(int i=0;i<n;i++)
{
int xx1=x2-x1,yy1=y2-y1,xx2=x3-x2,yy2=y3-y2;
int cj=xx1*yy2-xx2*yy1;
if(cj<=0)
{
convex = false;
break;
}
x1=x[(i+1)%n],y1=y[(i+1)%n],x2=x[(i+2)%n],y2=y[(i+2)%n],x3=x[(i+3)%n],y3=y[(i+3)%n];
}
if(convex)
{
printf("convex\n");
}
else
{
printf("concave\n");
}
}
return 0;
}
F - 比前面更简单的模拟
思路:模拟,统计字符串并按要求重排。
/*
Author:Owen_Q
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
char a[maxn];
int main()
{
while(scanf("%s",a)!=EOF)
{
if(strcmp(a,"E")==0)
{
break;
}
int alen = strlen(a);
int z=0;
int o=0;
int j=0;
for(int i=0;i<alen;i++)
{
if(a[i]=='Z')
{
z++;
}
else if(a[i]=='O')
{
o++;
}
else
{
j++;
}
}
while(z>0||o>0||j>0)
{
if(z>0)
{
printf("Z");
z--;
}
if(o>0)
{
printf("O");
o--;
}
if(j>0)
{
printf("J");
j--;
}
}
printf("\n");
}
return 0;
}
好了,差不多了,不做了。很快正式的摸底就要来了