由于水平有限,只做出了三道题。
第一题:A. Ostap and Grasshopper
水题,简单搜索,甚至算不上搜索,直接上代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
char s[105];
int n,k;
int main()
{
while(scanf("%d%d",&n,&k)!=EOF){
getchar();
scanf("%s",s);
int i,len;
len =strlen(s);
int p,q;
int flag=1;
for(i=0;i<len;i++){
if(s[i]=='G') p=i;
if(s[i]=='T') q=i;
}
int j=p;
if(p<q){
while(1){
j+=k;
if(s[j]==s[q]) break;
if(j>=len){
flag=0;
break;
}
if(s[j]=='#'){
flag=0;
break;
}
}
}
else if(p>q){
while(1){
j-=k;
if(s[j]==s[q]) break;
if(j<0){
flag=0;
break;
}
if(s[j]=='#'){
flag=0;
break;
}
}
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
第二题:大致意思是N个人,身上有不同的财富,有两个城市,每个城市可以住n1和n2个人,问怎么去居住才能使两个城市的财富值平均值最大。
思路:财富大的分给人数少的,财富小的分给人数多的就行了:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int siz=1e5+5;
int a[siz];
int n,n1,n2;
int main()
{
while(scanf("%d%d%d",&n,&n1,&n2)!=EOF){
int i;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
int t;
if(n1>n2){
t=n1;
n1=n2;
n2=t;
}
sort(a,a+n);
int k=0;
double sum1=0,sum2=0;
for(i=n-1;;i--){
sum1+=a[i];
++k;
if(k==n1){
break;
}
}
k=0;
while(i--){
sum2+=a[i];
++k;
if(k==n2) break;
}
double ans=sum1*1.0/n1+sum2*1.0/n2;
printf("%f\n",ans);
}
return 0;
}
第四题:大意:有一定数量的钱,但是要交这个数量除本身外最大因子的税,但是我们可以把这些钱分成若干份,然后按照分好后的钱再去交税,要求计算出最少要交的税是多少。
思路:素数除本身外的最大因子是1,所以如果是素数就输出1,。偶数可以分成两个素数之后,所以只要是偶数就输出2,但是2除外,它是素数,所以是1。但是如果是奇数就要分成是素数和不是素数,是素数就输出1,不是素数又要分成这个奇数能否分成一个2加另一个素数的和,如果可以就输出2,不能的话这个奇数就必定分解成三个素数之和(奇数加偶数是奇数,奇数加奇数加奇数也是奇数)。
题目:
Mr. Funt now lives in a country with a very specific tax laws. The total income of mr. Funt during this year is equal to n (n ≥ 2) burles and the amount of tax he has to pay is calculated as the maximum divisor of n (not equal to n, of course). For example, if n = 6 then Funt has to pay 3 burles, while for n = 25 he needs to pay 5 and if n = 2 he pays only 1 burle.
As mr. Funt is a very opportunistic person he wants to cheat a bit. In particular, he wants to split the initial n in several parts n1 + n2 + ... + nk = n (here k is arbitrary, even k = 1 is allowed) and pay the taxes for each part separately. He can't make some part equal to 1 because it will reveal him. So, the condition ni ≥ 2 should hold for all i from 1 to k.
Ostap Bender wonders, how many money Funt has to pay (i.e. minimal) if he chooses and optimal way to split n in parts.
The first line of the input contains a single integer n (2 ≤ n ≤ 2·109) — the total year income of mr. Funt.
Print one integer — minimum possible number of burles that mr. Funt has to pay as a tax.
4
2
27
3
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int prim(int n){
int flag=1;
int k=sqrt(n)+1;
if(n==1||n==2) return flag;
else{
int i;
for(i=2;i<=k;i++){
if(n%i==0){
flag=0;
break;
}
}
}
return flag;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
if(n%2==0&&n!=2){
printf("2\n");
}
else{
if(prim(n)==1){
printf("1\n");
}
else{
if(prim(n-2)==1){
printf("2\n");
}
else{
printf("3\n");
}
}
}
}
return 0;
}