A - Soft Drinking
题意:一共有n位朋友,k瓶l毫升的饮料,还有c个酸橙,每个酸橙会被切成d片,有p克盐。配一瓶酒需要nl毫升饮料,一片酸橙,np克盐,问每个朋友可以配几瓶
代码:
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n,k,l,c,d,p,nl,np;
cin>>n>>k>>l>>c>>d>>p>>nl>>np;
int t1,t2,t3;
t1=(k*l)/nl;
t2=c*d;
t3=p/np;
cout<<min(t1,min(t2,t3))/n<<endl;
return 0;
}
B - Phone Numbers
题意:有n个朋友,第i个朋友有si个电话号码。当电话号码数字全都相同时是taxi的号码,号码呈递减序列时是pizza的号码,其他是girls的号码。求当你对某种事物感兴趣时该找哪位朋友
题解:记录每位朋友拥有的taxi,pizza,girls的电话号码数量,找taxi就输出有taxi号码数量多的朋友名字,如果有其他朋友有相同数量多的号码数量按输入顺序输出。pizza,girl同理。按题意模拟,排三次序,注意输出格式。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;
#define MAXN 110
struct node{
string name;
int taxi;
int pizza;
int girls;
int no;
}a[MAXN];
int b[6],chuxian[10];
int check(string s){
int cnt=0,sum=0;
memset(chuxian,0,sizeof(chuxian));
for(int i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9'){
b[cnt++]=s[i]-'0';
if(!chuxian[s[i]-'0']){
sum++;
}
chuxian[s[i]-'0']++;
}
}
int flag=0;
for(int i=1;i<cnt;i++){
if(b[i]>=b[i-1]){
flag=1;
break;
}
}
if(sum==1){
return 1;
}else if(sum>1&&flag==0){
return -1;
}else{
return 0;
}
}
bool cmp1(node x,node y){
if(x.taxi==y.taxi){
return x.no<y.no;
}
return x.taxi>y.taxi;
}
bool cmp2(node x,node y){
if(x.pizza==y.pizza){
return x.no<y.no;
}
return x.pizza>y.pizza;
}
bool cmp3(node x,node y){
if(x.girls==y.girls){
return x.no<y.no;
}
return x.girls>y.girls;
}
int main(){
int n;
cin>>n;
int s;
string phone,nname;
for(int i=0;i<n;i++){
cin>>s>>nname;
a[i].name=nname;
a[i].no=i;
for(int j=0;j<s;j++){
cin>>phone;
if(check(phone)==0){
a[i].girls+=1;
}else if(check(phone)==1){
a[i].taxi+=1;
}else{
a[i].pizza+=1;
}
}
}
sort(a,a+n,cmp1);
cout<<"If you want to call a taxi, you should call: "<<a[0].name;
for(int i=1;i<n;i++){
if(a[i].taxi!=a[i-1].taxi){
break;
}else if(a[i].taxi==a[i-1].taxi){
cout<<", "<<a[i].name;
}
}
cout<<"."<<endl;
sort(a,a+n,cmp2);
cout<<"If you want to order a pizza, you should call: "<<a[0].name;
for(int i=1;i<n;i++){
if(a[i].pizza!=a[i-1].pizza){
break;
}else if(a[i].pizza==a[i-1].pizza){
cout<<", "<<a[i].name;
}
}
cout<<"."<<endl;
sort(a,a+n,cmp3);
cout<<"If you want to go to a cafe with a wonderful girl, you should call: "<<a[0].name;
for(int i=1;i<n;i++){
if(a[i].girls!=a[i-1].girls){
break;
}else if(a[i].girls==a[i-1].girls){
cout<<", "<<a[i].name;
}
}
cout<<"."<<endl;
return 0;
}
C - Win or Freeze
题意:两个人轮流玩游戏,每次移动过程中都要写下上一个数的非平凡数。如果一个数的除数与1和被除数本身不同,那么这个除数就被称为非平凡数。谁不能继续写谁就胜利了,如果第一个让你胜利,就要写下他第一次的移动
题解:如果这个数是1或者它本身是一个素数,就已经不能移动了,所以第一个人一开始就赢了。如果这个数是由两个素数相乘得到那么第一个人移动后,得到一个素数,第二个人不能再继续移动,第二个人获胜。如果这个数可以分解成两个以上的素数,第一个人第一次移动就可以写其中两个素数之积,最后一定是第一个人胜利。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 100010
ll a[MAXN];
ll cnt=0;
bool isp(ll x){
for(ll i=2;i*i<=x;i++){
if(x%i==0){
return false;
}
}
return true;
}
void issum(ll x){
ll tx;
tx=x;
for(ll i=2;i*i<=x;i++){
while(tx%i==0&&isp(i)){
a[cnt++]=i;
tx=tx/i;
}
}
if(tx!=1){
a[cnt++]=tx;
}
}
int main(){
ll q;
cin>>q;
if(q==1||isp(q)){
cout<<1<<endl;
cout<<0<<endl;
return 0;
}
issum(q);
if(cnt==2&&a[0]*a[1]==q){
cout<<2<<endl;
}else{
cout<<1<<endl;
cout<<a[0]*a[1]<<endl;
}
return 0;
}
D - Quantity of Strings
题意::长度为n的字符串,最多有m种不同的字符串,任意长度为K的字符串都是回文串。求有多少这样的字符串
题解:k=1或者让k>n时,每个位置都有m种选择,答案为mn。当k=n,不论k是奇数还是偶数都由其中的一半位置决定,如果是奇数,还有中间的位置也可任意选。当k<n并且k是奇数时,有两种情况,一种是这个字符串由一种字符构成,另一种是这个字符串由两种字符构成,答案为m+2*C mn=m+m(m-1)=m.当k<n并且k是偶数时,只有字符串由一种字符构成时符合,答案为m。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mod 1000000007
ll qpow(ll a,ll b){
ll ans=1;
while(b){
if(b&1){
ans=(ans%mod*a%mod)%mod;
}
a=(a%mod*a%mod)%mod;
b/=2;
}
return ans;
}
int main(){
int n,m,k;
cin>>n>>m>>k;
ll sum;
if(k==1||k>n){
sum=qpow(m,n);
}else if(k==n){
sum=qpow(m,(n+1)/2);
}else if(k<n&&k%2==1){
sum=qpow(m,2);
}else if(k<n&&k%2==0){
sum=m;
}
cout<<sum<<endl;
return 0;
}