#A Vestigium (7pts) https://codingcompetitions.withgoogle.com/codejam/round/000000000019fd27/000000000020993c?show=progress ##题解: t组数据。 每组数据给出一个n x n的矩阵,元素的取值都为1~n之间。 输出左对角线的和,每一行存在相同元素的行的个数,每一列存在相同元素的列的个数。 ##代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<cstring>
#include<vector>
#include<stack>
#include<math.h>
#include<map>
#define MAX 105
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int t,n;
int a[MAX][MAX],b[MAX];
int main(){
scanf("%d",&t);
for(int m=1;m<=t;m++){
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
int sum=0,row=0,col=0;
for(int i=0;i<n;i++){
memset(b,0,sizeof(b));
for(int j=0;j<n;j++){
if(b[a[i][j]]==1){
row++;
break;
}else{
b[a[i][j]]=1;
}
}
memset(b,0,sizeof(b));
for(int j=0;j<n;j++){
if(b[a[j][i]]==1){
col++;
break;
}else{
b[a[j][i]]=1;
}
}
}
for(int i=0;i<n;i++){
sum+=a[i][i];
}
printf("Case #%d: %d %d %d\n",m,sum,row,col);
}
return 0;
}
#B Nesting Depth (5pts, 11pts) https://codingcompetitions.withgoogle.com/codejam/round/000000000019fd27/0000000000209a9f?show=progress ##题解: t组数据。 给出一个由数字'0'~'9'组成的字符串,要求给每一个数添加括号,括号的个数等于这个数的值。 我们用两个数组记录每个数左括号和右括号的个数,当一个数num1大于前一个数num2时,给这个数添加(num1-num2)个左括号,否则给前一个数添加(num2-num1)个右括号。 最后我们在最后一个数后面补足右括号的数量即可。 ##代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<cstring>
#include<vector>
#include<stack>
#include<math.h>
#include<map>
#define MAX 105
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int t;
string s;
int main(){
cin>>t;
int a[MAX],b[MAX],sum1,sum2;
for(int m=1;m<=t;m++){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
sum1=sum2=0;
cin>>s;
int len=s.length();
a[0]=s[0]-'0',sum1+=a[0];
for(int i=1;i<len;i++){
if(s[i]>s[i-1]){
a[i]=s[i]-s[i-1];
}else{
b[i-1]=s[i-1]-s[i];
}
sum1+=a[i],sum2+=b[i-1];
}
printf("Case #%d: ",m);
for(int i=0;i<len;i++){
for(int j=0;j<a[i];j++){
cout<<"(";
}
cout<<s[i];
for(int j=0;j<b[i];j++){
cout<<")";
}
}
for(int i=0;i<sum1-sum2;i++){
cout<<")";
}
cout<<endl;
}
return 0;
}
#C Parenting Partnering Returns (7pts, 12pts) https://codingcompetitions.withgoogle.com/codejam/round/000000000019fd27/000000000020bdf9?show=progress ##题解: t组数据。 每组有n个活动,J和C两个人想参加所有的活动(只要两个人中有一个人参加了某个活动就代表这个活动有人参加了) 给出这些活动的开始和结束时间,需要你来寻找一个方案,来满足要求,并输出方案;若两个人不可能参与所有活动,则输出IMPOSSIBLE ##代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<cstring>
#include<vector>
#include<stack>
#include<math.h>
#include<map>
#define MAX 1005
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int t,n;
struct node{
int s,e,id,res;
}a[MAX];
bool cmp1(node a,node b){
return a.s<b.s;
}
bool cmp2(node a,node b){
return a.id<b.id;
}
int main(){
scanf("%d",&t);
for(int m=1;m<=t;m++){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].s,&a[i].e);
a[i].id=i;
}
sort(a,a+n,cmp1);
bool flag=true;
int end1=a[0].e,end2=0;
a[0].res=0;
for(int i=1;i<n;i++){
if(a[i].s>=end1){
a[i].res=0;
end1=a[i].e;
}else if(a[i].s>=end2){
a[i].res=1;
end2=a[i].e;
}else{
flag=false;
break;
}
}
printf("Case #%d: ",m);
if(!flag) cout<<"IMPOSSIBLE"<<endl;
else{
sort(a,a+n,cmp2);
for(int i=0;i<n;i++){
if(a[i].res==0) cout<<"J";
else cout<<"C";
}
}
cout<<endl;
}
return 0;
}
来源:oschina
链接:https://my.oschina.net/u/4395911/blog/3305379