打印
[其他]

灵动集训第二天

[复制链接]
502|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
l63t89|  楼主 | 2021-1-28 22:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
集训第二天
A题

#include<stdio.h>
#include<string.h>
#define maxn 1000
char a[19][30]={“pop”,“no”,“zip”,“zotz”,“tzec”,“xul”,“yoxkin”,“mol”,“chen”,“yax”,“zac”,“ceh”,“mac”,“kankin”,“muan”,“pax”,“koyab”,“cumhu”,“uayet”};
char b[20][30]={“imix”,“ik”,“akbal”,“kan”,“chicchan”,“cimi”,“manik”,“lamat”,“muluk”,“ok”,“chuen”,“eb”,“ben”,“ix”,“mem”,“cib”,“caban”,“eznab”,“canac”,“ahau”};
int FindMonth(char M[])
{
int i;
for(i=0;i<19;i++)
if(strcmp(M,a[i])==0)
break;
return i;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d\n",n);
for(;n>0;n–)
{
int M,D,Y,days=0;
char s[20];
scanf("%d. %s %d",&D,s,&Y);
M=FindMonth(s);
days=Y365+M20+D;
Y=days/(1320);
days%=(1320);
printf("%d %s %d\n",days%13+1,b[days%20],Y);
}
return 0;
}

害挺简单,感觉还行,主要就是打的字太多,于是我就复制粘贴,哈哈。

使用特权

评论回复
沙发
l63t89|  楼主 | 2021-1-28 22:26 | 只看该作者
B题
#include<stdio.h>
#include<string.h>
struct Point
{
double x;
double y;
}g[1005];
int main()
{
int n,i;
while(scanf("%d",&n)1)
{
for(i=0;i<n;++i)
scanf("%lf %lf",&g[i].x,&g[i].y);
g[n]=g[0];
printf("%d “,n);
for(i=0;i<n;++i)
printf(”%.6lf %.6lf “,(g[i].x+g[i+1].x)/2,(g[i].y+g[i+1].y)/2);
printf(”\n");
}
return 0;
}

这题就是简单的数学计算,主要是学习用结构体表示坐标。

使用特权

评论回复
板凳
l63t89|  楼主 | 2021-1-28 22:26 | 只看该作者
C题
#include
using namespace std;
char s[55][55][55];
int pre[55], last[55], mp[55], sum[55], ans[55];
int getp3(int x) {
int p1 = pre[x], p2 = pre[p1], p3 = pre[p2];
return p3;
}
int getp1(int x) {
int p1 = pre[x];
return p1;
}
int main() {
while(1) {
scanf("%s", s[1][1]);
if(s[1][1][0] == ‘#’) break;
last[1] = 2; sum[1] = 1; last[0] = 1;
for(int i = 2; i <= 52; i++) {
scanf("%s", s[i][1]);
pre[i] = i - 1;
last[i] = i + 1;
sum[i] = 1;
}
for(int i = 2; i <= 52; i = last[i]) {
int p = getp3(i);
if(p > 0 && (s[p][sum[p]][0] == s[i][sum[i]][0] || s[p][sum[p]][1]
== s[i][sum[i]][1])) {
sum[p]++;
s[p][sum[p]][0] = s[i][sum[i]][0];
s[p][sum[p]][1] = s[i][sum[i]][1];
sum[i]–;
if(sum[i] == 0) {
last[pre[i]] = last[i];
pre[last[i]] = pre[i];
}
i = p - 1;
continue;
}
p = getp1(i);
if(p > 0 && (s[p][sum[p]][0] == s[i][sum[i]][0] || s[p][sum[p]][1]
== s[i][sum[i]][1])) {
sum[p]++;
s[p][sum[p]][0] = s[i][sum[i]][0];
s[p][sum[p]][1] = s[i][sum[i]][1];
sum[i]–;
if(sum[i] == 0) {
last[pre[i]] = last[i];
pre[last[i]] = pre[i];
}
i = p - 1;
continue;
}
}
int cnt = 0;
for(int i = 1; i <= 52; i++) {
if(sum[i]) ans[cnt++] = sum[i];
}
printf("%d piles remaining: %d", cnt, ans[0]);
for(int i = 1; i < cnt; i++) {
printf(" %d", ans[i]);
}
printf("\n");
}
return 0;
}

这题好难哦,要用数组代替链表,还是不太清楚,得再揣摩揣摩。

使用特权

评论回复
地板
l63t89|  楼主 | 2021-1-28 22:27 | 只看该作者
D题

#include<bits/stdc++.h>
using namespace std;
string str,ans;
int Nex[100010];
void solve(){
int pos = 0,ls = 0;
Nex[0] = 0; str = “#” + str;
for(int i = 1; str[i]; i++){
if(str[i] == ‘[’) pos = 0;
else if(str[i] == ‘]’) pos = ls;
else{
Nex[i] = Nex[pos];
Nex[pos] = i;
if(pos == ls) ls = i;
pos = i;
}
}
for(int i = Nex[0]; i;i = Nex[i])
cout << str[i];
cout << endl;
}
int main(){
while(getline(cin,str)){
for(int i = 1;i <= 10;i++);
solve();
}
return 0;
}

这题也是数组代替链表,有点玄乎,得揣摩揣摩。

使用特权

评论回复
5
l63t89|  楼主 | 2021-1-28 22:28 | 只看该作者
E题

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int main()
{
double s,a,ang,arc,cho;
char c[5];
while(scanf("%lf %lf %s",&s,&a,c)!=EOF)
{
if(strcmp(c,“min”)0)
a=a/60;
if(a>180)a=360-a;
ang=aacos(-1.0)/180.0;
arc=2.0(s+6440.0)sin(ang/2.0);
cho=ang(s+6440.0);
printf("%.6lf %.6lf\n",cho,arc);
}
return 0;
}

重点在于数学计算,解决了数学计算代码就比较好打了。

使用特权

评论回复
6
l63t89|  楼主 | 2021-1-28 22:29 | 只看该作者
F题

#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int sgn(double x)
{
if(fabs(x) < 0.00000001) return 0;
else return x < 0 ? -1 : 1;
}
struct Point{
double x, y;
Point(){}
Point(double _x, double _y){
x = _x, y = _y;
}
bool operator == (Point b) const{
return sgn(x - b.x) == 0 && sgn(y - b.y) == 0;
}
bool operator < (Point b)const{
return sgn(x - b.x) == 0 ? sgn(y - b.y < 0) : x < b.x;
}
Point operator - (const Point &b)const{
return Point(x - b.x, y - b.y);
}
double operator ^(const Point &b){
return x * b.y - y * b.x;
}
double operator (const Point &b){
return x * b.x + y * b.y;
}
double len(){
return hypot(x, y);
}
double len2(){
return x * x + y * y;
}
double distant(Point p){
return hypot(x - p.x, y - p.y);
}
Point operator + (const Point &b)const{
return Point (x + b.x, y + b.y);
}
Point operator * (const double &k)const{
return Point(x * k, y * k);
}
Point operator / (const double &k)const{
return Point(x / k, y / k);
}
};
int main()
{
double x1, x2, x3, x4, y1, y2, y3, y4;
Point p[4], c;
while(~scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4))
{
p[0] = Point(x1,y1);
p[1] = Point(x2,y2);
p[2] = Point(x3,y3);
p[3] = Point(x4,y4);
sort(p , p + 4);
if(p[0] == p[1])
{
c = p[2] + p[3] - p[1];
}
if(p[1] == p[2])
{
c = p[0] + p[3] - p[1];
}
if(p[2] == p[3])
{
c = p[1] + p[0] - p[3];
}
printf("%.3f %.3f\n",c.x, c.y);
}
return 0;
}

重点仍在于数学计算,已知平行四边形三个点计算余下一点的坐标,这是今天第N次卡在了数学上。

使用特权

评论回复
7
l63t89|  楼主 | 2021-1-28 22:30 | 只看该作者
G题

#include<stdio.h>
#include<math.h>
int main()
{
double x1,y1,x2,y2,x3,y3;
double a,b,c,p,s,d,l;
while(scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF)
{
a=sqrt((x1-x2)(x1-x2)+(y1-y2)(y1-y2));
b=sqrt((x1-x3)(x1-x3)+(y1-y3)(y1-y3));
c=sqrt((x2-x3)(x2-x3)+(y2-y3)(y2-y3));
p=(a+b+c)/2;
s=sqrt(p(p-a)(p-b)(p-c));
d=(abc)/(2s);
l=d3.141592653589793;
printf("%.2lf\n",l);
}
}

简单的让我怀疑是不是做错了。

使用特权

评论回复
8
l63t89|  楼主 | 2021-1-28 22:31 | 只看该作者
H题

#include
#include
#include
using namespace std;
double a1,b1,a2,b2,d,r=6875/2.0;
char s[99];
int Get()
{
int a=0;
char c;
while((c=getchar())<‘0’||c>‘9’);
for(;c>=‘0’&&c<=‘9’;c=getchar())a=a*10+c-‘0’;
return a;
}
void GetA(double &a)
{
a=Get()+Get()/60.0+Get()/3600.0;
scanf("%s",s);
if(s[0]‘S’||s[0]‘W’)a=-a;
a=aacos(-1.0)/180;
}
int main()
{
while(gets(s),s[0]!=’=’)
{
GetA(a1),GetA(a1),GetA(b1),GetA(a2),GetA(b2);
d=racos(sin(a1)*sin(a2)+cos(a1)*cos(a2)*cos(b1-b2));
printf(“The distance to the iceberg: %.2lf miles.\n”,d);
if(floor(d+0.005)<100)puts(“DANGER!”);
gets(s);
}
return 0;
}

这题直接把人搞懵圈,想了半天才发现是求两点的距离,输入只是让人加一个遇到等号停止的函数。
结语:自己看了一点C++,现在勉强能看懂源代码了,感觉有了一点进步。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

776

帖子

1

粉丝