您的位置:首页 > 其它

sduacm16级寒假热身赛解题报告

2017-01-13 22:14 253 查看
题目链接https://vjudge.net/contest/147139

password: acmlab2016

A - Bachgold Problem

【题意】

给一个2到100000的数,将它拆成若干个素数的和.并使这个数目最大.

【思路】

水题。

【Code】

#include<cstdio>
int n;
int main()
{
scanf("%d",&n);
printf("%d\n",n/2);
for (int i=0;i<n/2-1;i++)
printf("2 ");
if (n%2==0) printf("2\n");
else printf("3\n");
return 0;
}


B - Parallelogram is Back

【题意】

给你平行四边形三个点的坐标,让你写出第四个点的所有可能的坐标.

【思路】

一定有三种可能,并且可以由数学方法计算出。

【Code】

#include<cstdio>
using namespace std;
int x1,x2,x3,y1,y2,y3;
int main()
{
while(~scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3))
{
printf("3\n");
printf("%d %d\n",x1+x2-x3,y1+y2-y3);
printf("%d %d\n",x1+x3-x2,y1+y3-y2);
printf("%d %d\n",x2+x3-x1,y2+y3-y1);
}
return 0;
}


C - Lesha and array splitting

【题意】

就是让这个数列分为几个小部分,每一部分相加都不为0,将每一部分的下标的最左和最右分别输出。

【思路】

只需要考虑这个数列相加是否为0,如果不为0让其整个一部分为一部分,如果为0的话则分为两部分,

第一个不是0的数之前为一部分,之后为一部分,全为0的话就输出NO。

【Code】

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1001],b[1001];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
int flag=0,sum=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
sum+=a[i];
if(a[i]!=0&&flag==0)
{
flag=i;
}
}
if(flag==0) printf("NO\n");
else{
if(sum!=0)  printf("YES\n1\n1 %d\n",n);
else  printf("YES\n2\n1 %d\n%d %d\n",flag,flag+1,n);
}

}
}


D - Ilya and tic-tac-toe game

【题意】

给你一个初始的图,问你能否在一步操作中x取得胜利。

//一开始一直以为要博弈…英语渣渣不想说话

【思路】

暴力枚举x放的位置。然后判断是否存在连着3x的.

【Code】

#include<cstdio>
#include<cstring>
using namespace std;
char a[10][10];
int fx[8]={1,-1,0,0,1,-1,1,-1};
int fy[8]={0,0,1,-1,1,-1,-1,1};
int judge()
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(a[i][j]=='x')
{
for(int z=0;z<8;z++)
{
int flag=0;
for(int k=1;k<=2;k++)
{
int xx=i+fx[z]*k;
int yy=j+fy[z]*k;
if(xx>=0&&xx<4&&yy>=0&&yy<4)
{
if<
4000
/span>(a[xx][yy]=='x')continue;
else flag=1;
}
else flag=1;
}
if(flag==0)return 1;
}
}
}
}
return 0;
}
int main()
{
memset(a,'.',sizeof(a));
for(int i=0;i<4;i++)
{
scanf("%s",a[i]);
}
int flag=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(a[i][j]=='.')
{
a[i][j]='x';
int tmp=judge();
a[i][j]='.';
if(tmp==1)flag=1;
}
}
}
if(flag==1)printf("YES\n");
else printf("NO\n");
}


E - New Year and Hurry

【题意】

你有240-k分钟的时间去解决至多n个问题,解决第i个问题需要5*i分钟。问最多能解决几个问题。

【思路】

水题。

【Code】

#include<cstdio>
int main()
{
int ans,n,k;
scanf("%d %d",&n,&k);
for (int i=1;i<=n;i++)
if (k+i*5<=240){
k+=i*5;
ans=i;
}
printf("%d\n",ans);
return 0;
}


F - New Year and North Pole

【题意】

给你一组移动方案,问是否合法

【思路】

不必考虑东西方向,只考虑南北方向。而且由于在北极只能向南走,在南极只能向北走。就可以认为是一条长20000的线段,然后就简单了。

【Code】

#include<cstdio>
char st[6];
int main()
{
int T,N,cut = 0,ok = 1;
scanf("%d",&T);
while(T--){
scanf("%d %s",&N,st);
if((cut == 0 && st[0] != 'S') || (cut == 20000 && st[0] != 'N'))
ok = 0;
if(st[0] == 'S')
cut += N;
else if(st[0] == 'N')
cut -= N;
if(cut < 0 || cut > 20000)
ok = 0;
}
if(!ok || cut != 0) printf("NO\n");
else  printf("YES\n");
return 0;
}


G - Santa Claus and a Place in a Class

【题意】

给你个m*2n的矩阵,问k在哪个位置。

【思路】

水题。

【Code】

#include<cstdio>
int n,m,k,x=1,y=1;
int main()
{
scanf("%d %d %d",&n,&m,&k);
while (k>2*m){
k-=2*m;
x++;
}
while (k>2){
k-=2;
y++;
}
if (k==2) printf("%d %d R\n",x,y);
else printf("%d %d L\n",x,y);
return 0;
}


H - Santa Claus and Keyboard Check

【题意】

经过一定的对应规则将两个字符串转化为相同的字符串,问是否存在这种可能,如果存在输出所有对应规则

【思路】

将每一步字符的对应规则存储起来,对应原字符也要存储起来,但不需要输出.

如果与前面的对应规则矛盾就输出-1.

一开始没有仔细考虑wa了4发….

【Code】

#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
char s1[1001],s2[1001];
int ans=0,n;
int c[150];
char d[30][2];
bool deal()
{
n=strlen(s1);
for (int i=0;i<n;i++)
{
if (s1[i]!=s2[i])
{
if (c[s1[i]]==s2[i]&&c[s2[i]]==s1[i]) continue;
if (c[s1[i]]!=0&&c[s1[i]]!=s2[i]) return false;
if (c[s2[i]]!=0&&c[s2[i]]!=s1[i]) return false;
c[s1[i]]=s2[i];
c[s2[i]]=s1[i];
d[ans][0]=s1[i];
d[ans][1]=s2[i];
ans++;
}else if (c[s1[i]]!=s1[i]&&c[s1[i]]!=0) return false;
else if (c[s1[i]]==0){
c[s1[i]]=s1[i];
}
}
return true;
}
int main()
{
scanf("%s",s1);
scanf("%s",s2);
if (!deal())
{
printf("-1\n");
return 0;
}
printf("%d\n",ans);
for (int i=0;i<ans;i++)
printf("%c %c\n",d[i][0],d[i][1]);
return 0;
}


I - Felicity is Coming!

【题意】

  每个体育馆有一定数量的小精灵,每个宠物小精灵都有自己的类型。相同类型的小精灵会进化成相同类型的精灵,不同类型的小精灵进化成的精灵的类型都不相同。

  你的任务是找到不同的进化计划的个数,使得所有宠物小精灵在它们的体育馆都进化过,且每个体育馆的每种类型的宠物小精灵的数量保持不变。

【思路】

  保存下每个类型的小精灵所在体育馆,判断两个小精灵的在的体育馆种类和出现次数是否相同

  在所在体育馆出现次数都相同的小精灵会组成一个个集合。设这些集合的大小为x1,x2,x3…..

对于一个大小为x的集合,方案数为x!,即为他们的全排列数。那么ans=x1!*x2!*x3!…..xk!

【Code】

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1000005;
const int mod  = 1000000007;
int n, m;
vector<int> a[maxn];

int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int num;
scanf("%d",&num);
while(num--){
int flag;
scanf("%d",&flag);
a[flag].push_back(i);
}
}
sort(a+1,a+m+1);
/*for(int i=1;i<=m;i++)
{
printf("%d----",i);
for (int j=0;j<a[i].size();j++)
printf("%d ",a[i][j]);
printf("\n");
}*/
long long ans = 1;
int fnum=1;
for(int i=2;i<=m;i++)
if(a[i] == a[i-1]){
fnum++;
ans = (ans*fnum)%mod;
}else  fnum= 1;
printf("%lld\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm