网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=39485#overview
A
题意:看有多少个str字符串里有全部[0,k]个数字
水~
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main(){
int n,k;
string str;
while(cin >> n >> k){
int ans = 0;
while(n--){
cin >> str;
bool b[10] = {0};
int len = str.length();
for (int i = 0; i < len; i++)
b[str[i]-'0'] = true;
bool v = true;
for (int i = 0; i <= k; i++)
if (!b[i]) v = false;
if (v) ans++;
}
cout <<ans << endl;
}
}
B
题意:求数列中满足斐波那契的最长长度
没用数组存,滚动的存了下
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int main(){
int n;
int a,b,c;
int maxm = 0;
int sum = 0;
cin >> n;
if (n > 0) {cin >> a; maxm = ++sum; n--;}
if (n > 0) {cin >> b; maxm = ++sum; n--;}
while(n--){
cin >> c;
if (c == a + b)
sum++;
else{
sum = 2;
}
a = b;
b = c;
if (sum > maxm) maxm = sum;
}
cout << maxm << endl;
}
C
题意:给了一个a和s,矩阵b[i][j]=s[i]*[j],求子矩阵个数
第i行是ai*(a1,a2,..,an),用sum[i]表示数列a的前i项和。
那么任意一个子矩阵和可以表示为(sum[j1]-sum[j0])*(sum[i1]-sum[i0]) ,穷举之。
a==0的情况要特殊考虑#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int main(){
int a;
string s;
long long v[40000],sum[5000];
cin >> a >> s;
int len = s.length();
memset(sum,0,sizeof(sum));
memset(v,0,sizeof(v));
for (int i = 0; i < len; i++)
sum[i+1] = sum[i] + s[i] - '0';
for (int i = 1; i <= len; i++)
for (int j = 0; j < i; j++)
v[sum[i]-sum[j]]++;
long long ans = 0L;
if (a == 0){
for (int i = 0; i <= sum[len]; i++)
ans += v[0]*v[i];
}
for (int i = 1; i <= sum[len]; i++)
if (a % i == 0 && a / i <= sum[len])
ans +=v[a/i]*v[i];
cout << ans << endl;
}
D
题意:a,b个球分别放在两个盒子里,求最少的步数
用了贪心+卡时,因为a+b<2147483648,算法大约时间是log(a+b)所以卡时碰运气,答题忘写不满足要输出-1了。。。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
typedef long long ll;
using namespace std;
ll a, b;
void swap(ll &a, ll &b){
if (b < a) {
ll t = a;
a = b;
b = t;
}
}
int main(){
cin >> a >> b;
for (ll i = 0 ; i < 1000000; i++){
swap(a,b);
if (a == 0){
cout << i<< endl;
return 0;
}
b -= a;
a += a;
}
cout << "-1" << endl;
}