A
对于递归写法,显然会TLE,由递归式转化为递推式即可。
#include <cstdio>
using namespace std;
typedef long long ll;
const int mod = 10000007;
const int maxn = 100000+5;
ll f[maxn];
int main()
{
int T,tc = 0;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%lld%lld%lld%lld%lld%lld%d",&f[0],&f[1],&f[2],&f[3],&f[4],&f[5],&n);
f[0]%=mod;f[1]%=mod;f[2]%=mod;
f[3]%=mod;f[4]%=mod;f[5]%=mod;
for(int i = 6;i <= n; ++i)
f[i] = (f[i-1] + f[i-2] + f[i-3] + f[i-4] + f[i-5] + f[i-6])%mod;
printf("Case %d: %lld\n",++tc,f[n]);
}
return 0;
}
B
模拟题
#include <cstdio>
using namespace std;
int main()
{
int t,tc = 0;
scanf("%d",&t);
while(t--)
{
int a,b;
scanf("%d%d",&a,&b);
int ans=a-b;
ans>0?ans:ans*=-1;
ans+=a;
ans*=4;
ans+=19;
printf("Case %d: %d\n",++tc,ans);
}
return 0;
}
C
模拟题,暴力即可。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100+5;
int a[maxn];
char str[10];
int main()
{
int t,tc = 0;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i = 1; i <= n ;++i) scanf("%d",&a[i]);
while(m--)
{
scanf("%s",str);
if(str[0]=='P')
{
int x,y;
scanf("%d%d",&x,&y);
x++;y++;
swap(a[x],a[y]);
}
else if(str[0]=='R')
{
for(int i = 1;i <= n/2; ++i)
swap(a[i],a[n+1-i]);
}
else if(str[0]=='S')
{
int num;
scanf("%d",&num);
for(int i = 1;i <= n; ++i) a[i] += num;
}
else if(str[0]=='M')
{
int num;
scanf("%d",&num);
for(int i = 1;i <= n; ++i) a[i] *= num;
}
else
{
int num;
scanf("%d",&num);
for(int i = 1;i <= n; ++i) a[i] /= num;
}
}
printf("Case %d:\n",++tc);
for(int i=1;i<=n;i++) printf("%d%c",a[i],i == n ?'\n':' ');
}
return 0;
}
D
要求输出满足N*M = W的最小M和与其对应的N
显然当M为2的幂次时,M最小
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
int main()
{
int t,tc = 0;
scanf("%d",&t);
while(t--)
{
ll n;
scanf("%lld",&n);
printf("Case %d: ",++tc);
if(n&1)
printf("Impossible\n");
else
{
ll ans = 1;
while(n%2==0){
ans*=2;
n/=2;
}
printf("%lld %lld\n",n,ans);
}
}
return 0;
}
E
熟悉国际象棋的规则就是水题= =
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int t,tc = 0;
scanf("%d",&t);
while(t--)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("Case %d: ",++tc);
x1=abs(x1-x2);
y1=abs(y1-y2);
if(x1 == y1) ///对角线上
printf("1\n");
else
{
if(x1%2==y1%2)
printf("2\n");
else
printf("impossible\n");
}
}
return 0;
}
F
贪心思想的运用= =
尽可能选小的能保证最多
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 50;
int a[maxn];
int main()
{
int T,tc = 0;
scanf("%d",&T);
while(T--)
{
int n,p,q;
scanf("%d%d%d",&n,&p,&q);
for(int i = 0; i < n; ++i) scanf("%d",&a[i]);
sort(a,a+n);
int ans = 0,cnt = 0;
while(q >= 0 && cnt < n)
{
if(ans >= p || q < a[cnt]) break;
q -= a[cnt++];
++ans;
}
printf("Case %d: %d\n",++tc,ans);
}
return 0;
}
G
考查结构体排序
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
struct stu
{
char name[25];
int sum;
};
bool cmp(stu x,stu y) {
return x.sum<y.sum;
}
stu s[101];
int main()
{
int t,tc = 0;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x,y,z;
scanf("%s%d%d%d",s[i].name,&x,&y,&z);
s[i].sum=x*y*z;
}
printf("Case %d: ",++tc);
sort(s+1,s+n+1,cmp);
if(s[1].sum == s[n].sum)
printf("no thief\n");
else
{
printf("%s took chocolate from %s\n",s[n].name,s[1].name);
}
}
return 0;
}