A - Pokemon Master
题目大意:比重量
代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
int a[1005];
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
int sum1,sum2;
sum1=sum2=0;
cin>>n>>m;
for(int i=0; i<n; i++)
{
int x;
cin>>x;
sum1+=x;
}
for(int i=0; i<m; i++)
{
int x;
cin>>x;
sum2+=x;
}
//cout<<sum1<<" "<<sum2<<endl;
if(sum1>sum2)
cout<<"Calem"<<endl;
if(sum1<sum2)
cout<<"Serena"<<endl;
if(sum1==sum2)
cout<<"Draw"<<endl;
}
return 0;
}
B - Problem Arrangement
题目大意:安排一场比赛把题目安排在不同的位置会有不用的有趣值,求最大有趣值
http://blog.csdn.net/y990041769/article/details/24136457
代码:
#include <bits/stdc++.h>
int dp[1<<13][510]; //dp[i][j]表示取i的二进制位值兴趣值为j时的个数
int f[13];
int a[13][13];
void isit()//表示全部的阶乘
{
f[1]=1;
for(int i=2;i<13;i++)
f[i]=f[i-1]*i;
}
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int T,m,n;
scanf("%d",&T);
isit();
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=0;i<=(1<<n);i++) //所有情况
{
int tmp=0; //已经表示过的题数
for(int j=1;j<=n;j++)
if(i&(1<<(j-1)))//表示过就++
tmp++;
//printf("%d\n",tmp);
for(int j=1;j<=n;j++)//对于每个题目遍历
{
if(i&(1<<(j-1))) continue;
for(int k=0;k<=m;k++)//每个状态遍历
{
if(k + a[tmp+1][j] >= m) //把大于值m得全部保存到j
dp[i+(1<<(j-1))][m] += dp[i][k];
else
dp[i+(1<<(j-1))][k+a[tmp+1][j]] += dp[i][k];
}
}
}
if(dp[(1<<n)-1][m] == 0)
printf("No solution\n");
else
{
int tm = gcd(f[n],dp[(1<<n)-1][m]);
printf("%d/%d\n",f[n]/tm, dp[(1<<n)-1][m]/tm);
}
}
}
C - Talented Chef
题目大意:有点像以前的三个饼两个锅,然后最快多少时间做出来.大概猜了一下整除,然后就过了
代码:#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
using namespace std;
int a[40005];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m,sum1=0,maxnum=0;
cin>>n>>m;
for(int i=0; i<n; i++)
{
cin>>a[i];
sum1+=a[i];
if(a[i]>maxnum)
maxnum=a[i];
}
if(sum1%m==0)
cout<<max(sum1/m,maxnum)<<endl;
else cout<<max(sum1/m+1,maxnum)<<endl;
}
return 0;
}
E - Paint the Grid Again
题目大意:每次操作能把每一行变成X,或者每一列变成O,问如何操作能变出结果.有多种的话,输出字典序最小的.思路就是反向模拟.相当于一张白纸,然后画了好几笔变成所求的图案,如今我们要反向拆解,直到再次变回一张白纸.当然,多次重复覆盖的点设成特殊值,特判就行.这里我设成”.”
代码:
#include<bits/stdc++.h>
using namespace std;
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
char G[505][505];
int col[505],row[505];
int n;
char ch[1005];
int id[1005];
bool check()
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(G[i][j]!='.')
return 0;
return 1;
}
int findok(int cnt)
{
for(int i=n; i>=1; i--)
{
if(row[i])continue;
int j,t=0;
for(j=1; j<=n; j++)
{
if(G[i][j]=='O')
break;
else if(G[i][j]=='.')t++;
}
if(t==n)
{
row[i]=1;
continue;
}
if(j==(n+1))
{
row[i]=1;
ch[cnt]='R';
id[cnt]=i;
for(int k=1; k<=n; k++)
G[i][k]='.';
return 1;
}
//cout<<j<<endl;
}
//cout<<1111<<endl;
for(int i=n; i>=1; i--)
{
if(col[i])continue;
int j,t=0;
for(j=1; j<=n; j++)
{
if(G[j][i]=='X')
break;
else if(G[j][i]=='.')t++;
}
if(t==n)
{
col[i]=1;
continue;
}
if(j==(n+1))
{
col[i]=1;
ch[cnt]='C';
id[cnt]=i;
for(int k=1; k<=n; k++)
G[k][i]='.';
return 1;
}
}
return 0;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1; i<=n; i++)
scanf("%s",G[i]+1);
memset(col,0,sizeof(col));
memset(row,0,sizeof(row));
int cnt=0,goal=1;
while(1)
{
if(check())
break;
int deal=findok(cnt++);
if(deal==0)
{
goal=0;
break;
}
//cout<<1<<endl;
}
if(goal==0)
{
cout<<"No solution"<<endl;
continue;
}
for(int i=cnt-1; i>=0; i--)
{
cout<<ch[i]<<id[i];
if(i!=0)
cout<<" ";
}
cout<<endl;
}
return 0;
}
F - Paint the Grid Reloaded
题目大意:传说中的缩点最短路,待补.
http://blog.csdn.net/cacyth/article/details/45169215
代码:
#include<bits/stdc++.h>
using namespace std;
string G[50];
int t,n,m;
vector<int> y[1610];
int vis[50][50];
int dx[]= {0,0,-1,1};
int dy[]= {1,-1,0,0};
void dfs(int p,int q,int id,char c)
{
for(int i=0; i<4; i++)
{
int ii=p+dx[i];
int jj=q+dy[i];
if(ii<0||ii>=n||jj<0||jj>=m)continue;
if(G[ii][jj]==c&&vis[ii][jj]==0)
{
vis[ii][jj]=id;
dfs(ii,jj,id,c);
}
else if(G[ii][jj]!=c&&vis[ii][jj]>0)
{
y[vis[ii][jj]].push_back(id);
y[id].push_back(vis[ii][jj]);
}
}
}
int bfs(int p)
{
int v[1610];
memset(v,0,sizeof(v));
queue < pair<int,int> > q;
q.push(make_pair(p,1));
v[p]=1;
int res=0;
while(!q.empty()){
pair<int,int> fr=q.front();
q.pop();
res=max(fr.second,res);
for(int i=0;i<y[fr.first].size();i++){
if(v[y[fr.first][i]]==0){
q.push(make_pair(y[fr.first][i],fr.second+1));
v[y[fr.first][i]]=1;
}
}
}
return res;
}
int main()
{
cin>>t;
while(t--)
{
memset(vis,0,sizeof(vis));
cin>>n>>m;
for(int i=1; i<=n*m; i++)
y[i].clear();
for(int i=0; i<n; i++)
cin>>G[i];
int cnt=0;
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(!vis[i][j])
{
vis[i][j]=++cnt;
dfs(i,j,cnt,G[i][j]);
}
}
}
int ans=999999;
for(int i=1; i<=cnt; i++)
{
ans=min(ans,bfs(i));
}
cout<<ans-1<<endl;
}
return 0;
}
G - Ternary Calculation
题目大意:很正常的暴力题目
代码:#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int ans=0;
int a1,a2,a3,flag;
char c1,c2;
flag=0;
scanf("%d %c %d %c %d",&a1,&c1,&a2,&c2,&a3);
if(c1=='*'||c1=='/'||c1=='%'||c2=='*'||c2=='/'||c2=='%')//*/%
flag=1;
if(flag)
{
if((c1=='*'||c1=='/'||c1=='%')&&(c2=='*'||c2=='/'||c2=='%'))//都是*/
{
if(c1=='*')
ans=a1*a2;
else if(c1=='/')
ans=a1/a2;
else if(c1=='%')
ans=a1%a2;
if(c2=='*')
ans=ans*a3;
else if(c2=='/')
ans=ans/a3;
else if(c2=='%')
ans=ans%a3;
}
else
{
if(c1=='*'||c1=='/'||c1=='%')
{
if(c1=='*')
ans=a1*a2;
else if(c1=='/')
ans=a1/a2;
else if(c1=='%')
ans=a1%a2;
if(c2=='+')
ans=ans+a3;
else if(c2=='-')
ans=ans-a3;
}
if(c2=='*'||c2=='/'||c2=='%')
{
if(c2=='*')
ans=a2*a3;
else if(c2=='/')
ans=a2/a3;
else if(c2=='%')
ans=a2%a3;
if(c1=='+')
ans=ans+a1;
else if(c1=='-')
ans=a1-ans;
}
}
}
else
{
if(c1=='+')
ans=a1+a2;
else if(c1=='-')
ans=a1-a2;
if(c2=='+')
ans=ans+a3;
else if(c2=='-')
ans=ans-a3;
}
cout<<ans<<endl;
}
return 0;
}
J - What day is that day?
题目大意:有点恶心的找规律题目.如果第一次写的话,还真的要郁闷死
代码:#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
using namespace std;
int a[295],b[42];
long long n;
void init()
{
int temp,sum1;
for(int i=1; i<=42; i++)
{
temp=i%7;
for(int j=0; j<i-1; j++)
{
temp=(temp*i)%7;
}
b[i]=temp%7;
//cout<<b[i]<<" ";
}
sum1=0;
for(int i=1; i<=294; i++)
{
sum1=(sum1+b[i%42])%7;
a[i]=sum1;
/*cout<<sum1<<" ";
if(i%294==0)
cout<<endl;*/
}
}
string day[7]= {"Saturday","Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday"};
int main()
{
int t;
init();
cin>>t;
while(t--)
{
cin>>n;
cout<<day[a[n%294]]<<endl;
}
return 0;
}
L - Access System
题目大意:简单的模拟,把时间化到秒就能做了
代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
using namespace std;
struct stu
{
int time,id;
};
stu a[20005];
bool cmp(stu x, stu y)
{
return x.time<y.time;
}
int ans[20005];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
int h,m,s;
scanf("%d:%d:%d",&h,&m,&s);
a[i].time=3600*h+60*m+s;
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
int cnt=0,pst;
ans[cnt++]=a[1].id;
pst=a[1].time;
for(int i=2; i<=n; i++)
{
if(a[i].time-pst>=m)
{
ans[cnt++]=a[i].id;
pst=a[i].time;
}
}
cout<<cnt<<endl;
sort(ans,ans+cnt);
for(int i=0; i<cnt; i++)
{
if(i!=0)cout<<" ";
cout<<ans[i];
}
cout<<endl;
}
return 0;
}