A - A FZU - 2272
题意:
鸡兔同笼,水题。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int T,n,m;
cin>>T;
while(T--)
{
cin>>n>>m;
int x=(4*n-m)/2;
int y=n-x;
cout<<y<<" "<<x<<endl;
}
return 0;
}
D - D FZU - 2275
题意思路:
给你两个字符串,a和b,对a进行两种操作,(1)顺序颠倒(2)处于10(相当于去掉最后一位)。注意此处有个很大的坑,只要字符串b为一个0时,则一定可以变换成,例如 111 、11、 1均可以得到0,因为最后一个数1除于10得到的为0.另外就是b的长度一定要小于a的长度,否则不会变换成,其余的情况就用kmp算法来在a串里面寻找b串,看能否找到,找到即可变换而成,否则就不能变换成
代码:
#include<iostream>
#include<cstring>
using namespace std;
const int MAX=10000010;
int f[MAX];
char a[MAX], b[MAX], c[MAX];
int Find(char *T, char *P, int n, int m)
{
int i=0, k=0;
while(i<n)
{
if(k==-1 || T[i]==P[k])
{
i++;
k++;
if(k==m)
return 1;
}
else
k=f[k];
}
return 0;
}
void getFail(char *P, int m)
{
f[0]=-1;
int temp=-1;
int j=0;
while(j<m)
{
if(temp==-1 || P[j]==P[temp])
{
j++;
temp++;
f[j]=temp;
}
else
temp=f[temp];
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>a>>b;
int la=strlen(a), lb=strlen(b);
if(b[0]=='0'&&lb==1){
cout<<"Alice"<<endl;
continue;
}
if(lb>la){
cout<<"Bob"<<endl;
continue;
}
for(int i=0; i<lb; i++)
{
c[i]=b[lb-1-i];
}
int flag=0;
getFail(b, lb);
flag=Find(a, b, la, lb);
if(flag==0)
{
getFail(c, lb);
flag=Find(a, c, la, lb);
}
if(flag==0)
{
cout<<"Bob"<<endl;
}
else
{
cout<<"Alice"<<endl;
}
}
return 0;
}
G - G FZU - 2278
题意:
有n种卡片,如果你想获得其中一种就得花费W金币,每次只能得到一种,并且得到每一种的概率都是1/n,问你得到n种卡片期望的天数是多少?
思路:
其实就是第一天 n/n * w 第二天 (n-1/n ) * w 所以得到一种是(n/n-1)*w,第二天(n-2/n)*w即得到一种:(n/n-2)*w....
即可推出一个公式: w*(n/n+n/n-1+n/n-2+...n)即n!(1+1/2+1/3+1/4+...+1/n)因为数据太大,用的Java大数
代码:
import java.math.BigInteger;
import java.util.*;
public class Main
{
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
BigInteger c[]=new BigInteger[3005];
c[0] = BigInteger.ONE;
for(int i=1;i<=3000;i++)
{
c[i] = c[i-1].multiply( BigInteger.valueOf(i) );
}
int T=cin.nextInt();
while(T-->0)
{
int n = cin.nextInt();
BigInteger sum = BigInteger.ZERO;
for(int i=1;i<=n;i++) {
sum=sum.add(c[n].divide(BigInteger.valueOf(i)));
}
System.out.print(sum);
System.out.println(".0");
}
}
}
J - J FZU - 2281
题意:
题意有n天,有一个物品的价格会每天浮动,每天的价格ai(1<=i<=n),在一开始你有m元RMB,在每一天,你可以以ai的价格买进任意个物品,也可以以ai的价格卖出任意个物品,前提是你有足够的钱和足够的物品,问你在n天后最多能获得多少钱?最后的答案要mod1e9+7
思路:
代码:
import java.math.BigInteger;
import java.util.*;
public class Main
{
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
long n;
BigInteger m=null;
long MOD=1000000007;
BigInteger c[]=new BigInteger[2005];
int T,cas=0;
T=cin.nextInt();
while(T-->0)
{
n=cin.nextLong();
m = cin.nextBigInteger();
for(int i=1;i<=n;i++)
c[i]=cin.nextBigInteger();
c[(int) (n+1)]=BigInteger.valueOf(-1);
int s,t=0;
s=1;
while(s<=n) //找最大值、最小值
{
for(int i=s+1;i<=n+1;i++)
{
if(c[i].compareTo(c[i-1])<0)
{
t=i-1;
break;
}
}
BigInteger num=m.divide(c[s]);
m=m.mod(c[s]);
m=m.add(c[t].multiply(num));
s=t+1;
}
System.out.println("Case #"+(++cas)+": "+m.mod(BigInteger.valueOf(MOD)));
}
cin.close();
}
}
L-L FZU-2283
题意:
给你一个3*3的井字棋,判断Kim是否能够通过两步 。 赢得对手。两步赢得对手的步骤是:Kim下,对方下,Kim下。
如果棋子能够三连就算Kim赢。
思路:
①首先我们暴力枚举一个位子,使得这个位子就是Kim下的位子。
②然后check一下是否能够胜利。
③然后我们不枚举对方的走法,因为对方要足够聪明,所以我们枚举Kim下一步走哪里会赢,如果有这样一个位子,对手肯定要阻拦。那么怎样的条件对方阻拦不了Kim的胜利呢?就是Kim下一步,如果有两个位子以上的放置方案会赢,那么对手如何阻拦都不行了。
④过程模拟一下即可
代码:
#include <iostream>
using namespace std;
int mp[10];
int kim;
int flag;
int vis[5];
int check()
{
if(mp[1] == mp[2] && mp[2]==mp[3] && mp[3] == kim)
{
return 1;
}
if(mp[4] == mp[5] && mp[5] ==mp[6] && mp[6] == kim)
{
return 1;
}
if(mp[7] == mp[8] && mp[8] == mp[9] && mp[9] == kim)
{
return 1;
}
if(mp[1] == mp[5] && mp[5] == mp[9] && mp[9] ==kim)
{
return 1;
}
if( mp[3] == mp[5] && mp[5] == mp[7] && mp[7] == kim)
{
return 1;
}
if(mp[1] == mp[4] && mp[4] == mp[7] && mp[7] ==kim)
{
return 1;
}
if(mp[2] == mp[5] && mp[5] ==mp[8] && mp[8] == kim)
{
return 1;
}
if(mp[3] == mp[6] && mp[6] ==mp[9] && mp[9] == kim)
{
return 1;
}
return 0;
}
int judge()
{
if( check()==1 ) return 1;
int tot=0;
for(int i=1;i<=9;i++)
{
if(mp[i]==0)
{
mp[i] = kim;
if(check()==1)
{
tot++;
}
mp[i]=0;
}
}
if(tot >= 2) return 1;
else return 0;
}
int main()
{
int t;
char ch;
cin>>t;
while(t--)
{
for(int i=1;i<=9;i++)
{
cin>>ch;
if(ch=='.') mp[i] = 0;
else if(ch == 'x') mp[i] = 1;
else mp[i] = 2;
}
cin>>ch;
if(ch=='.') kim=0;
else if(ch == 'x') kim=1;
else kim = 2;
flag = 0;
for(int i=1; i<=9; i++)
{
if(mp[i] == 0)
{
mp[i] = kim;
if(judge() == 1)
{
flag = 1;
}
mp[i] = 0;
}
}
if(flag==1) cout<<"Kim win!"<<endl;
else cout<<"Cannot win!"<<endl;
}
return 0;
}
- T = I-1;打破
- ,所以我们枚举Kim下一步走哪里会赢