连涨六次RATING居然还是不够紫T_T,不过确实分数不够(明明每次差一点!!!)
A.Nineteen
水题,统计每个字母出现次数,然后ans--验证
不知道哪还有BUG 还是有人FST
#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cctype>
#include<cmath>
#include<ctime>
#include<utility>
#define M0(x) memset(x, 0, sizeof(x))
#define Inf 0x7fffffff
using namespace std;
int main()
{
char s[110];
scanf("%s",&s);
int i,j;
int len=0;
for(i=0;s[i]!='\0';i++)
len++;
int g[100];
memset(g,0,sizeof(g));
for(i=0;i<len;i++)
{
if(s[i]=='n') g[1]++;
if(s[i]=='i') g[2]++;
if(s[i]=='e') g[3]++;
if(s[i]=='t') g[4]++;
}
int ans=0;
for(i=100;i>=0;i--)
{
if( i*2+1<=g[1] && i<=g[2] && i*3<=g[3] && i<=g[4] )
{
ans=i;break;
}
}
printf("%d",ans);
return 0;
}
#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cctype>
#include<cmath>
#include<ctime>
#include<utility>
#define M0(x) memset(x, 0, sizeof(x))
#define Inf 0x7fffffff
using namespace std;
int main()
{
int i,j;
double w[200][200];
double a[200][200],b[200][200];
memset(a,0.0,sizeof(a));
memset(b,0.0,sizeof(b));
int n;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%lf",&w[i][j]);
}
double p,q;
for(i=1;i<=n;i++)
{
for(j=i;j<=n;j++)
{
if(i==j)
{
a[i][j]=w[i][j];
b[i][j]=0;
continue;
}
p=(w[i][j]-w[j][i])/2;
b[i][j]=p;b[j][i]=0-p;
a[i][j]=w[i][j]-p;
a[j][i]=w[i][j]-p;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%lf ",a[i][j]);
}
printf("\n");
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%lf ",b[i][j]);
}
printf("\n");
}
return 0;
}
C. Blocked Points
|
当且仅当两个点的几何距离是1且两个点都不是障碍物的点,
或者存在点C使得AC、BC都是4-连通
一开始整个二维平面上没有障碍物,设和原点距离不超过n的点为特殊点,
至少需要把多少个点变成障碍才能使特殊点和非特殊点之间都不是4-连通
其实就是把圆内点和圆外点分开,做一个1/8 或1/4圆弧的遍历,算出x+1后高的差,即为该x除需处理的点个数
0要特判一下。
之前每个x写的一次算出,结果精度不够T-T。所以还是拿别人代码来了
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std ;
typedef long long LL ;
LL N ;
LL ans=0;
int main()
{
LL i, j, tmp ;
scanf("%I64d", &N) ;
if(N == 0)
ans = 1 ;
else
{
for(i = 1; i <= N-1; i ++)
{
tmp = sqrt(N*N-i*i)+1e-9 ;
while(true)
{
if(tmp > 0 &&
(tmp*tmp+(i+1)*(i+1) > N*N || (tmp+1)*(tmp+1)+i*i > N*N))
ans ++ ;
else break ;
tmp -- ;
}
}
ans = ans*4+4 ;
}
printf("%I64d\n", ans) ;
//system("pause") ;
return 0 ;
}
另外这题有公式,见图
带价值汉诺塔游戏,之前考虑把普通汉诺塔程序过程拿来累加,不过貌似还是得DP
#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cctype>
#include<cmath>
#include<ctime>
#include<utility>
using namespace std;
int t[3][3];
int dis[3][3];
long long dp[50][3][3][3];
long long dfs(int s,int i,int j,int k)
{
long long ans=0;
if(s==1)
{
return dis[i][k];
}
if(dp[s][i][j][k]) return dp[s][i][j][k];
long long cost1=dfs(s-1,i,k,j)+t[i][k]+dfs(s-1,j,i,k);
long long cost2=dfs(s-1,i,j,k)+t[i][j]+dfs(s-1,k,j,i)+t[j][k]+dfs(s-1,i,j,k);
return dp[s][i][j][k]=min(cost1,cost2);
}
int main()
{
int n;
for(int i=0; i<3; ++i)
for(int j=0; j<3; ++j)
scanf("%d",&t[i][j]);
for(int i=0; i<3; ++i)
for(int j=0; j<3; ++j)
for(int k=0; k<3; ++k)
if(i!=j&&j!=k&&i!=k)
dis[j][k]=min(t[j][k],t[j][i]+t[i][k]);
scanf("%d",&n);
printf("%I64d",dfs(n,0,1,2));
}
E.
会看这个题解的人应该不需要
|
反正我也没看,有时间再补