T1 Odds and Ends
题意:
将n个数字分成奇数份,每份首尾均为奇数,可以输出“Yes”。
解法:
循环递归。
代码:
#include<bits/stdc++.h>
using namespace std ;
int x[1000000 ];
bool y[100000 ];
int main() {
int a,b=0 ,c,tou=0 ,wei=0 ;
cin >>a;
c=a;
y[a]=true ;
for (int i=0 ; i<a; i++) {
cin >>x[i];
if (x[i]%2 !=0 ) {
y[i]=true ;
}
}
if (y[0 ]!=true ||a%2 ==0 ||y[a-1 ]!=true )
cout <<"No" ;
else {
while (wei!=c) {
for (int i=a/2 ; i>=0 ; i--)
if (y[tou]==true &&y[wei+i*2 ]==true &&y[wei+i*2 +1 ]==true ) {
b++;
y[tou]=false ;
y[wei+i*2 ]=false ;
tou=wei+i*2 +1 ;
wei=tou;
a=a-2 *i;
}
}
if (b%2 !=0 )
cout <<"Yes" ;
else
cout <<"No" ;
}
return 0 ;
}
小结:
**此类题目需要特判。**
T2 Tell Your World
题意:
输入n个数字,在平面上构成n个以(i,Xi)为坐标的点,问是否可以将这些点连成两条不重叠的平行线?可以输出"YES".
解法:
利用斜率.
代码:
#include<bits/stdc++.h>
using namespace std ;
int s[3000 ],n;
bool judge(double k)
{
int p=-1 ;
for (int i=2 ; i<=n; i++)
{
if (s[i]-s[1 ]==(i-1 )*k)
continue ;
if (p==-1 )
p=i;
else if (s[i]-s[p]!=(i-p)*k)
return 0 ;
}
return p!=-1 ;
}
int main()
{
while (scanf ("%d" ,&n)!=EOF)
{
for (int i=1 ; i<=n; i++)
scanf ("%d" ,&s[i]);
if (judge(s[2 ]-s[1 ])||judge((s[3 ]-s[1 ])*1.0 /2 )||judge(s[3 ]-s[2 ]))
printf ("Yes\n" );
else
printf ("No\n" );
}
}
小结:
**此类题目需要特判。**
T3 From Y to Y
题意:
输入一个数字a,用特定的方法输出一串字符,使他的价值为a.(具体详见原题)
解法:
递归.
代码:
#include<bits/stdc++.h>
using namespace std ;
int f(int a) {
int x=0 ;
x+=(a+1 )*a/2 ;
return x;
}
int main() {
int a;
char b='a' ;
cin >>a;
if (a==0 )
cout <<b;
else {
while (a!=0 ) {
for (int i=0 ; i<=477 ; i++)
if (f(i)<=a&&f(i+1 )>a) {
a-=f(i);
for (int j=1 ; j<=i+1 ; j++)
cout <<b;
b++;
}
}
}
return 0 ;
}
小结:
**此类题目需要特判。**
T4 Harmony Analysis
题意:
输入一个数字a,用特定的方法输出一串字符,使他的价值为a.(具体详见原题)
解法:
近似分型.
代码:
#include<bits/stdc++.h>
using namespace std ;
char x[1000 ][1000 ];
int main() {
int a,b=2 ;
x[1 ][1 ]='+' ;
x[1 ][2 ]='+' ;
x[2 ][1 ]='+' ;
x[2 ][2 ]='*' ;
cin >>a;
if (a==0 )
{cout <<"+" ;
return 0 ;
}
while (a!=1 ) {
for (int i=1 ; i<=b; i++)
for (int j=1 ; j<=b; j++) {
x[i+b][j]=x[i][j];
x[i][j+b]=x[i][j];
if (x[i][j]=='+' )
x[i+b][j+b]='*' ;
else
x[i+b][j+b]='+' ;
}
b=b*2 ;
a--;
}
for (int i=1 ;i<=b;i++)
{
for (int j=1 ;j<=b;j++)
cout <<x[i][j];
cout <<endl;
}
return 0 ;
}
小结:
**此类题目可以先手算找规律。**
T5 Bear and Prime Numbers
题意:
输入n,再输入n个整数,出入m,以下m行,每行2个整数,表示一个范围.输出范围内质数再数列n中出现的次数和.
解法:
筛法求质数+优化+暴力模拟.
代码:
#include<stdio.h>
#include<string.h>
#define M 10000010
int b[M],count[M];
bool visit[M];
int num=0 ;
void init_prim()
{
memset (visit,true ,sizeof (visit));
for (int i=2 ; i<M;++i)
{
if (visit[i]==true )
{
if (b[i])count[i]+=b[i];
for (int j=i*2 ; j<M; j+=i)
{
count[i]+=b[j];
visit[j]=false ;
}
}
}
for (int i=2 ; i<M; i++)
count[i]+=count[i-1 ];
}
int main()
{
int n,q,l,r,s;
init_prim();
while (scanf ("%d" ,&n)!=EOF)
{
memset (b,0 ,sizeof (b));
for (int i=1 ; i<=n; i++)
{
scanf ("%d" ,&s);
b[s]++;
}
init_prim();
scanf ("%d" ,&q);
for (int cas=0 ; cas<q; cas++)
{
scanf ("%d%d" ,&l,&r);
if (l>M)l=M-1 ;
if (r>M)r=M-1 ;
printf ("%d\n" ,count[r]-count[l-1 ]);
}
}
return 0 ;
}
小结:
**此类题目需要特判。**