昨天的比赛好郁闷.......倒不是因为题目......在快要比赛的时候突然所有的网站都进不去了.......改了半天的DNS & IP......比赛都比了1个多小时才进去.....都不想做题了= =|||
A.POJ 3210 Coins
这道题感觉似曾相识......貌似很久以前做过= =
其实仔细想一下,题目并不难~若n为偶数的话,那么"偶正+偶负"翻转的一定是偶数次;而"奇正+奇负"翻转的一定是奇数次~故没有确定的最少次数~
但是,若n为奇数的话,是"奇正+偶负"或"偶正+奇负",翻转的都是偶数次~故存在确定的最少次数!
代码:
#include <iostream>
#include <cstdio>
using namespace std; int main()
{
int n;
while(scanf("%d",&n),n)
{
if(n%==)
printf("No Solution!\n");
else
printf("%d\n",n-);
}
return ;
}
//memory:164KB time:16ms
B.HDU 4506 小明系列故事――师兄帮帮忙
此处求k^t时要采用反复平方法(快速幂)【该方法在另一篇博客里讲的有~链接】,否则会TLE~
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; #define M 1000000007
int T,i;
__int64 a[],b[];
__int64 n,t,k; __int64 Pow(__int64 x,__int64 n) //快速幂~
{
__int64 ret=,s=x;
while()
{
if(n&)
ret=(ret%M*s%M)%M;
if(n>>=)
s=(s%M*s%M)%M;
else
break;
}
return ret;
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%I64d%I64d%I64d",&n,&t,&k);
k=Pow(k,t);
t=t%n; //因为t很有可能会大于n,故这一步很重要!!!!
for(i=;i<n;i++)
scanf("%I64d",&a[i]);
for(i=t;i<n;i++)
b[i]=(a[i-t]%M*k)%M;
for(i=;i<t;i++)
b[i]=(a[i+n-t]%M*k)%M;
for(i=;i<n-;i++)
printf("%I64d ",b[i]);
printf("%I64d\n",b[n-]);
}
return ;
}
//memory:428KB time:46ms
C.HDU 2546 饭卡
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; int main()
{
int n,a[],f[],m;
while(scanf("%d",&n),n)
{
for(int i=;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
scanf("%d",&m);
if(m>=)
{
memset(f,,sizeof(f));
for(int i=;i<n-;i++)
for(int j=m-;j>=a[i];j--)
if(f[j-a[i]]+a[i]>f[j] && f[j-a[i]]+a[i]<=m-)
f[j]=f[j-a[i]]+a[i];
printf("%d\n",m-f[m-]-a[n-]);
}
else
printf("%d\n",m);
}
return ;
}
D.HDU 1026 Ignatius and the Princess I
......Loading......