目录
- Problem A: 数三角形
- Problem B: 项链
- Problem E: M.wjw的星期五
- Problem G: 卡斯丁狗要吃糖葫芦
- Problem J: 【蟠桃记】
- Problem K: 背包
- Problem L: 造围栏
Problem A: 数三角形
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 617 Solved: 350
Description
给定一个等边三角形,它的每条边被分成n等分,分别用平行于三边的直线过各个n等分点截这个三角形,如图所示:
请问,图中总共有多少个三角形?
Input
输入包含多组测试数据,直至EOF。
每组测试数据包含一个正整数n,表示三角形三边被分为了n等份(n<500)。
Output
输出三角形的个数。
Sample Input
1 2 3
Sample Output
1 5 13
-
一道数学题吧。。。。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n%2) //如果是偶数
cout<<(n+1)*(2*n*n+3*n-1)/8<<endl;
else //奇数
cout<<n*(n+2)*(2*n+1)/8<<endl;
}
return 0;
}
Problem B: 项链
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 102 Solved: 45
Description
强迫症非常麻烦,尤其是买东西的时候。冠璐女神的生日快到了,某强迫症要送一条项链送给她,重点是,这条项链要对称,这条项链要对称,这条项链要对称。(很重要所以说三遍)
项链都是环状的(废话...),每条项链上有颜色不同的珍珠,用小写字母 a−z 代表不同的颜色。一条项链是对称的,是指从项链的某个位置开始,两个方向看过去是一样的(珍珠的颜色一样)。
比方说,如图所示的项链(第一个输入样例),从箭头位置开始看,无论是顺时针还是逆时针,看到的都是ababbaba,因此这条项链是对称的。
有的项链非常长,很难看出它们的对称性。你能快速地判断哪些项链是对称的吗?
Input
第一行有一个整数N,表示一共有N条项链。
接下来N行,每行一个由小写字母组成的字符串,代表项链上珍珠的颜色,可能从项链的任意位置开始。
Output
输出N行,如果项链是对称的,输出YES,否则输出NO。
Sample Input
3
abbabaab
abab
abcdefg
Sample Output
YES
YES
NO
HINT
1≤N≤5,项链长度≤10^5
-
c_str()是string类的一个成员函数, 返回常量char *类型的C风格字符串。
-
strstr()判断s是否是z的子串,如果是就返回yes;
-
将s串乘2再反转,如果是对称的话那原串必定是该处理后的子串
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
string s,z;
scanf("%d",&n);
while(n--)
{
cin>>s;
z=s+s;
reverse(z.begin(),z.end());
printf("%s\n",strstr(z.c_str(),s.c_str())?"YES":"NO");
}
}
Problem E: M.wjw的星期五
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 39 Solved: 17
Description
wjw最近运气极其差,什么roll点1-100连着十次都是个位数啊,买个珍珠奶茶没有珍珠啊,吃方便面没有调料包啊...
迷信的wjw觉得,一定是因为这个月的13号正好是星期五,才会导致他的运气这么差。
现在他想知道,在某个年份中,有多少个月的13号是星期五,这样他才可以提前做好心理准备。
PS.已知1998年1月1日是星期四,输入的年份肯定大于或等于1998年。
Input
input
输入只有一行,表示年份(大于等于1998年)
Output
output
输出只有一行,表示这一年中有多少个月的13号是星期五
Sample Input
1998
Sample Output
3
HINT
说明:(1)一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;
#include<bits/stdc++.h>
using namespace std;
const int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int x,cnt=0,pp=0;
scanf("%d",&x);if(x%400==0 || (x%4==0&&x%100!=0))pp=1;
for(int i=1998;i<x;i++)
{
if(i%400==0 || (i%4==0&&i%100!=0))
cnt++;//记闰年数
}
int days=(x-1998)*365+cnt;
int y=(days%7+4)%7;//该年第一天是周几
int sum=0,flag=0;
for(int i=1;i<=12;i++)
{
if(pp==1&&i==3)sum++;//cout<<((sum+13)%7+y-1)%7<<endl;
if(((sum+13)%7+y-1)%7==5)flag++;
sum+=month[i];
}
cout<<flag<<endl;
}
Problem G: 卡斯丁狗要吃糖葫芦
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 191 Solved: 70
Description
卡斯丁狗喜欢吃糖葫芦(喜欢前面再加两个字“并不”),但是,但是,他很挑剔,他只吃这样的,就是这样的,就是,就是不管你从哪一头吃,看起来都是一样的,卡斯丁狗给你了一个很长的串,他记得这个很长的串有N个长度一样且满足上述的条件的串组成,你告诉他,他有没有记错。
Input
一个字符串,和一个数N(N<=1000)
Output
YES或者NO
Sample Input
abbatxxt 2
abbatxtc 2
Sample Output
YES
NO
-
判断n能否被len(长度)整除,如果不能直接输出NO了!!
-
然后判断每一段是否为回文串
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000000;
char a[maxn];
int main()
{
int n;
memset(a,'\0',sizeof(a));
while(~scanf("%s",a))
{
scanf("%d",&n);
int len=strlen(a);//for(int k=0;a[k]!='\0';k++)cout<<a[k]<<",";
if(len%n!=0) //一开始就因为没有判断然后就WA!!!横!!
{
cout<<"NO\n";continue;
}
int x=len/n;
int i=0,j=0,flag=1,y=0,k;
while(j<n)
{
k=0;
y=x*(j+1);//cout<<"y="<<y<<endl;
//cout<<"i="<<i<<endl;cout<<"y="<<y<<endl;
for(i;i<(y+x)/2;i++)
{
//printf("a[%d]=%c,a[%d]=%c\n",i,a[i],y-1-k,a[y-1-k]);
//cout<<""<<a[i]<<endl;
//cout<<""<<a[y-i-1]<<endl;
if(a[i]!=a[y-1-k])
{
flag=0;break;
}
k++;
}
i=y;//cout<<"i="<<i<<endl;
j++;
}
if(flag)cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
Problem J: 【蟠桃记】
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 498 Solved: 441
Description
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
什么问题?他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题,呵呵^-^
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
Input
输入数据有多组,每组占一行,包含一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的
Output
对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。
Sample Input
2 4
Sample Output
4 22
-
注意是可以从第n天往前递推的;
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0||n>30)break;
int s=1;
for(n; n>1; n--)
{
s=(s+1)*2;
}
printf("%d\n",s);
}
}
Problem K: 背包
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 193 Solved: 102
Description
你有一个神奇的背包,他的容积是m(0<m<=80),只有你装满他,你才能拿走他,现在给你n(1<=n<=20)个物品Xi(Xi<=m),那么一共有几种方式,可以让你拿走背包?
Input
第一行 n,m
第二行 n个数字
Output
输出方案数
Sample Input
3 40
20 20 20
Sample Output
3
-
dfs
-
参考:
-
模板↓↓↓
void dfs(变量){
if(超出阈值){ //判断边界
return;
}
if(条件成立){
ans++;
return;
}
for(int i=s;i<n;i++){ //尝试每一种可能性
dfs(step+1); //继续下一步
}
return;
}
-
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,x[30],i,j,ans;//n:物品数;m:容积;x:每个物品体积;ans:方案数
void dfs(int v,int s){ //深度优先搜索(不撞南墙不回头)
//v:容积;s:下标
if(!v){ //如果容积是0则表示已经装满了,也是一种装法,然后返回
ans++;
return;
}
if(s>n||v<0) //下标>n,即装了所有的物品都没装满;v<0,装太多了剩下的容积不够
return; //不符合,结束
for(int i=s;i<n;i++) //继续尝试
dfs(v-x[i],i+1);
return;
}
int main(){
while(cin>>n>>m){
for(i=0;i<n;i++)cin>>x[i];
ans=0;
dfs(m,0);
cout<<ans<<endl;
}
return 0;
}
Problem L: 造围栏
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 216 Solved: 92
Description
在那,山地那边,海地那边,n*m的格子里面有k匹草泥马。学名曰羊驼。LLL非常喜欢骑马,所以他就想偷至少一匹泥马,如果他骑马逃出了n*m的格子就代表偷马成功,他可以驾驭任何一匹泥马。每个回合内LLL可以驾驭他的泥马往上下左右任意地方移动一格。而牧马人JJJ发现有人在偷他的马,所以就想造围栏把泥马围在n*m的格子里面,每个回合内JJJ可以造一个围栏。现在假设两个人都采取最佳的策略,LLL先下手,问最后LLL是否得手
Input
多组测试数据
第一行输入n,m ,k (1<=n,m<=100, 0<=,k<=100,)
接下来k行每行输入x,y。表示每只神兽的位置(1<=x<=n,1<=y<=m)
Output
成功输出YES。
否则输出NO。
Sample Input
2 2 1
1 2
3 4 0
100 50 2
50 25
50 25
Sample Output
YES
NO
NO
-
找规律的题,其实没有太懂,但是代入验证的话确实是这样。把四个角都堵死就不能成功
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[101][3],n,m,k;
while(~scanf("%d%d%d",&n,&m,&k))
{
int x=0;判断用
if(k==0)printf("NO\n");//没有马就肯定是失败的了
else
{
for(int i=1;i<=k;i++)//有k匹马
scanf("%d%d",&a[i][1],&a[i][2]);//输入马的坐标(x,y)
for(int i=1;i<=k;i++)//遍历坐标进行判断
{
if(a[i][1]<=5)//上边距
{
cout<<"YES\n";
x=1;
break;
}
if((n-a[i][1])<=4)//下边距
{
cout<<"YES\n";
x=1;
break;
}
if(a[i][2]<=5)//左边距
{
cout<<"YES\n";
x=1;
break;
}
if((m-a[i][2])<=4)//右边距
{
cout<<"YES\n";
x=1;
break;
}
}
if(x==0)cout<<"NO\n";
}
}
return 0;
}