目录
A.费解的开关
题目链接
题意
开开关,使得最终所有灯全亮。
题解
首先枚举第一行开关的状态,然后改变本行开关的状态交给下一行来完成。
这是一道水题--
代码
#include <bits/stdc++.h>
using namespace std;
#define INIT(x) memset(x,0,sizeof(x))
#define eps 1e-8
#define next next_
typedef long long ll;
typedef unsigned long long ull;
const int INF = 0x7fffffff;
const int inf = 0x3f3f3f3f;
const int maxn = 200005;
const int N = 105;
inline void read(int &x) {
int f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
x*=f;
}
inline void print(int x) {
if(x<0){ putchar('-'); x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0');
}
inline void caltime(int tt) {
tt = clock() - tt;
cerr << (double)tt/CLOCKS_PER_SEC << " seconds!" << endl;
}
inline void print_matrix(int a[N][N],int n,int m,bool flag=0) {
if(flag) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}else {
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
}
inline void print_line(int *a,int n,bool flag=0) {
if(flag) {
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
}else {
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
}
cout<<endl;
}
int dx[5] = {-1,0,1,0,0}, dy[5] = {0,1,0,-1,0},a[N][N],t,b[N][N];
void flip(int x,int y) {
for(int i=0;i<5;i++) {
int newx = x+dx[i];
int newy = y+dy[i];
if(newx>=0&&newx<5&&newy>=0&&newy<5)
a[newx][newy] ^= 1;
}
}
bool check() {
for(int i=0;i<5;i++)
for(int j=0;j<5;j++) {
if(a[i][j]==0) {
return false;
}
}
return true;
}
int main()
{
cin>>t;
while(t--) {
for(int i=0;i<5;i++) {
string s;
cin>>s;
for(int j=0;j<5;j++)
a[i][j] = s[j]-'0';
}
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
b[i][j] = a[i][j];
int ans = INF;
for(int i=0;i<32;i++) {
int cnt = 0;
for(int j=0;j<5;j++) {
if((i>>j)&1) {
flip(0,j);
cnt++;
}
}
for(int j=0;j<4;j++) {
for(int k=0;k<5;k++) {
if(!a[j][k]) {
flip(j+1,k);
cnt++;
}
}
}
if(check()) ans = min(ans,cnt);
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
a[i][j] = b[i][j];
}
if(ans>6) cout<<-1<<endl;
else cout<<ans<<endl;
}
return 0;
}
B.四层汉诺塔
题目链接
POJ1958
题意
求4柱汉诺塔的最少移动次数
题解
三层汉诺塔中,f[n] = f[n-1]*2+1, 可以看成先把n-1个盘子移到B盘上,再把第n个盘子移到C盘上,最后把n-1个盘子移动到C盘上,于是就有了这个递推式。
在四层汉诺塔中,则有 f[n] = min(2*f[i] + d[n-i]) (1<=i<n) ,意思就是先把i个盘子移动到B柱子,剩下的就转化成了3塔问题。
依次类推,n塔m盘问题均可这么转化。
注意,n=64时 d数组会爆 long long ,所以用unsigned long long.
代码
ull n,f[maxn],d[maxn];
int main()
{
memset(f,0x7f,sizeof(f));
d[1] = 1;
for(int i=2;i<=64;i++) {
d[i] = d[i-1]*2+1;
}
f[1] = 1;
for(int i=2;i<=64;i++) {
for(int j=1;j<i;j++)
f[i] = min(f[i],2*f[j]+d[i-j]);
}
while(cin>>n)
cout<<f[n]<<endl;
return 0;
}
C.前缀和问题
题目链接
poj3263
题意
有n头奶牛,其中第i个最高,其高度为h,现在给出m组关系:每组有两个数i和j,表示位置i和位置j的奶牛能看见对方。(只有两头奶牛之间的奶牛都比它们矮,它们才能看见对方)
题解
首先,如果a和b能互相看见,那么a和b之间奶牛的最高高度全都减去1,这可以用差分前缀和来维护;
但是要注意的是要去重,可能a和b重复给了两次,不能计算两次。
代码
#include <bits/stdc++.h>
using namespace std;
#define INIT(x) memset(x,0,sizeof(x))
#define eps 1e-8
#define next next_
typedef long long ll;
typedef unsigned long long ull;
const int INF = 0x7fffffff;
const int inf = 0x3f3f3f3f;
const int maxn = 200005;
const int N = 105;
inline void read(int &x) {
int f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
x*=f;
}
inline void print(int x) {
if(x<0){ putchar('-'); x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0');
}
inline void caltime(int tt) {
tt = clock() - tt;
cerr << (double)tt/CLOCKS_PER_SEC << " seconds!" << endl;
}
inline void print_matrix(int a[N][N],int n,int m,bool flag=0) {
if(flag) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}else {
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
}
inline void print_line(int *a,int n,bool flag=0) {
if(flag) {
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
}else {
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
}
cout<<endl;
}
int n,I,H,R,a[maxn],f[maxn];
set<pair<int,int> >s;
int main()
{
INIT(a);
cin>>n>>I>>H>>R;
for(int i=0;i<R;i++) {
int l,r;
read(l),read(r);
if(l>r) swap(l,r);
s.insert(make_pair(l,r));
}
for(auto i:s) {
int l = i.first,r = i.second;
a[l+1]--,a[r]++;
}
for(int i=1;i<=n;i++) {
a[i] = a[i-1]+a[i];
cout<<a[i]+H<<endl;
}
return 0;
}