题目链接:http://codeforces.com/gym/101350
最大公因数(gcd)
cin/cout会tle
long long型输入输出用%ld会wa,要用%I64d
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll x[100005];
ll gcd(ll a,ll b){
if(b==0) return a;
return gcd(b,a%b);
}
int main(){
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
ll sum=0,ans=0;
for(int i=0;i<n;i++){
scanf("%I64d",&x[i]);
if(i==0) ans=x[i];
else ans=gcd(x[i],ans);
sum+=x[i];
}
printf("%I64d %I64d\n",sum,ans);
}
return 0;
}
用map<string,double>就好,注意的是cin/cout会tle,所以输入用字符型数组,再将字符型数组中的内容转存到string中
#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<string,double>Map;
int main(){
int t,C,N;
scanf("%d",&t);
while(t--){
double t=0;
Map["JD"]=1.0;
scanf("%d%d",&C,&N);
for(int i=0;i<C;i++){
string s;
char tmp[15];
scanf("%s",tmp);
scanf("%lf",&t);
int len=strlen(tmp);
for(int j=0;j<len;j++) s+=tmp[j];
Map[s]=t;
}
double ans=0.0;
for(int i=0;i<N;i++){
string s;
char tmp[15];
scanf("%lf",&t);
scanf("%s",tmp);
int len=strlen(tmp);
for(int j=0;j<len;j++) s+=tmp[j];
ans+=Map[s]*t;
}
printf("%.6lf\n",ans);
}
return 0;
}
子串,直接暴力
#include<bits/stdc++.h>
using namespace std;
char s[1005];
map<char,bool>Map;
void init(){
Map.clear();
char tmp[15];
strcpy(tmp,"AHIMOTUVWXY");
int len=strlen(tmp);
for(int i=0;i<len;i++){
Map[tmp[i]]=true;
}
}
int judge(char A[],int n){
int t;
if(n%2==0) t=n/2;
else t=n/2+1;
int cnt=0;
for(int i=0;i<t;i++){
if(A[i]==A[n-i-1]){
if(i!=n-i-1) cnt+=2;
else cnt++;
}
else return -1;
}
return cnt;
}
int main(){
init();
int T;
scanf("%d",&T);
while(T--){
memset(s,0,sizeof s);
scanf("%s",s);
int n=strlen(s);
int ans=0;
for(int i=0;i<n;i++){
if(Map[s[i]]==true){
char tmp[1000];
int k=0;
for(int j=i;j<n;j++){
if(Map[s[j]]==false) break;
else tmp[k++]=s[j],tmp[k]=0;
int hh=judge(tmp,k);
//cout<<i<<" "<<j<<" "<<tmp<<" "<<k<<" "<<hh<<endl;
ans=max(ans,hh);
}
}
}
printf("%d\n",ans);
}
return 0;
}
(看了好久才看懂题意=.=)将每一个y中出现次数最多的数字计数+1,最终答案输出计数最多同时最小的数字,暴力
#include<bits/stdc++.h>
using namespace std;
int cntt[100005],cnt[10];
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(cntt,0,sizeof cntt);
int a,b,n;
scanf("%d%d%d",&a,&b,&n);
if(a+b>n){
printf("-1\n");
continue;
}
int mx;
for(int x=1;;x++){
int y=a*x*x+b*x;
memset(cnt,0,sizeof cnt);
mx=0;
if(y>n) break;
while(y!=0){
int t1=y%10;
cnt[t1]++;
mx=max(mx,cnt[t1]);
y/=10;
}
for(int i=0;i<=9;i++){
if(cnt[i]==mx) cntt[i]++;
}
}
int ans=0;
for(int i=0;i<=9;i++){
if(cntt[i]>cntt[ans]) ans=i;
}
printf("%d\n",ans);
}
return 0;
}