A
题目很长,但是描述基本没用,大水题,下次读题再也不能让题目的长短影响对题目的判断,可跳跃性的阅读,阅读也是一种能力
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int main()
{
int c=0;
int n,num;
while(cin>>n)
{
c++;
if(n==0)
break;
else
{
int s1=0;
int s2=0;
for(int i=0;i<n;i++)
{
cin>>num;
if(num!=0)
s1++;
else
s2++;
}
cout<<"case "<<c<<": ";
cout<<s1-s2<<endl;
}
}
return 0;
}
题目链接:UVA上的,直接拿题目去搜吧
题目大意:将一个矩阵A转化为矩阵B,A/B中数字的范围都是1-k,每一步转化可将A中一个数字转化为1-k中的任意数字,但在转化过程中不能出现对称矩阵,让你求最少需要几步转化,若无法将A转化为B,输出-1.
有一种很特殊的样例是需要注意的:
A:1 2
3 1
B:1 3
2 1
特殊在A[1][2]==B[2][1] A[2][1]==B[1][2]
所以变两次肯定不行,因为会出现对称阵。k=2时也需要好好分析
下面是两份代码:
第一份:根据k分情况讨论
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; int map1[200][200]; int map2[200][200]; int T,n,k; int main() { int i,j; int sum; //记录总的需要改变的个数 int ans; //记录特殊情况的个数 int cases=0; scanf("%d",&T); while(T--) { cases++; scanf("%d%d",&n,&k); sum=0; ans=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&map1[i][j]); } } for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&map2[i][j]); if(map2[i][j]!=map1[i][j]) sum++; } } printf("Case %d: ",cases); int sum1=0; for(i=0;i<n;i++) { if(map1[i][i]!=map2[i][i]) sum1++; } if(sum==0) printf("0\n"); else { int cot=0;//判断map2是否对称矩阵 for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(map2[i][j]!=map2[j][i]) cot++; } } if(cot==0) printf("-1\n"); else { for(i=0;i<n;i++) { for(j=0;j<i;j++) { if(map2[i][j]!=map2[j][i]&&map1[i][j]==map2[j][i]&&map1[j][i]==map2[i][j]) ans+=2; } } if(k==2) { if(n==2&&map1[0][1]==map2[1][0]&&map1[1][0]==map2[0][1]) printf("-1\n"); else if(ans==2&&ans==sum-sum1) printf("%d\n",sum+2); else printf("%d\n",sum); } else if(k>2) { if(ans==2&&ans==sum-sum1) printf("%d\n",sum+1); else printf("%d\n",sum); } } } } return 0; }
第二种:根据输出的结果讨论分析
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int map1[200][200];
int map2[200][200];
int T,n,k;
int main()
{
int i,j;
int sum; //记录总的需要改变的个数
int ans; //记录特殊情况的个数
int cases=0;
scanf("%d",&T);
while(T--)
{
cases++;
scanf("%d%d",&n,&k);
sum=0;
ans=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&map1[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&map2[i][j]);
if(map2[i][j]!=map1[i][j])
sum++;
}
}
printf("Case %d: ",cases);
int sum1=0;
for(i=0;i<n;i++)
{
if(map1[i][i]!=map2[i][i])
sum1++;
}
if(sum==0)
printf("0\n");
else
{
int cot=0;//判断map2是否对称矩阵
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(map2[i][j]!=map2[j][i])
cot++;
}
}
if(cot==0||(n==2&&k==2&&map1[1][0]==map2[0][1]&&map1[0][1]==map2[1][0]))
printf("-1\n");
else
{
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
if(map2[i][j]!=map2[j][i]&&map1[i][j]==map2[j][i]&&map1[j][i]==map2[i][j])
ans+=2;
}
}
if(k==2&&ans==2&&ans==sum-sum1)
printf("%d\n",sum+2);
else
{
// cout<<"sum:"<<sum<<" sum1:"<<sum1<<" ans:"<<ans<<endl;
if(ans==2&&(ans==sum-sum1))
printf("%d\n",sum+1);
else
printf("%d\n",sum);
}
}
}
}
return 0;
}
C:Optimal Store
VUA上的,这道题重点是一定要读懂题目,可是自己读了半天也没读懂,大神一来,连读带猜就把样例弄懂了,呵呵,下次一定要大胆的敢于猜测
//C:
//注意取值范围和时间限制 scanf long long
//要敢于去猜测,敢于去想,敢于去敲代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
long long a;
long long f[100];
void ff()
{
f[1]=1;
f[2]=2;
for(int i=3; i<=50; i++)
f[i]=f[i-1]+f[i-2];
}
int main()
{
ff();
//cout<<f[45]<<endl;
int T,n;
scanf("%d",&T);
for(int cas=1; cas<=T; cas++)
{
int ans;
long long sum=1;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
ans=0;
scanf("%d",&a);
int j=45;
for(j=45;j>=1;j--)
{
while(a>=f[j])
{
a-=f[j];
ans++;
}
}
sum*=ans;
//cout<<"jajaj"<<endl;
}
printf("Case %d: %lld\n",cas,sum);
//cout<<"Case "<<cas<<": "<<sum<<endl;
}
return 0;
}