3月10日 模拟题

prime.cpp

这第一道题特简单。。。。。

一个俩质数相乘的数只有1,那俩质数(可能有1),和他本身那几个约数,

那我找到小的那个质数,用大数除以它则是答案了。

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
#include<string>
//#include<map>
//bool isprime[3];
using namespace std;
long long n;
long long ans;
long long prime(long long n)
{
	for(int i = 2;i * i <= n;i++)
	{
		 if(n % i == 0) return (n/i);
	}
}
int main()
{
//	freopen("prime.in","r",stdin);
//	freopen("prime.out","w",stdout);
	scanf("%lld",&n);
	ans = prime(n);
	printf("%lld",ans);
	return 0;
}


这道模拟题,,,死在循环判断出错。。。结果就wa加tle,,,(生无可恋脸)

本来看形势能得200分的结果就。。。

用了一个技巧:输入时保留了每一层有楼梯的房间数floor[i],这样可以快速得到step,需要转移的最小次数,避免了大数据。

然后就模拟就做出来了

代码:

#include<bits/stdc++.h>
using namespace std;
const int cen = 10005;
const int fang = 105;
const int MOD = 20123;
int n,m,sta;
long long x,ans;
int a[cen][fang];
int flag[cen][fang];
int Floor[cen];
int main()
{
// freopen("treasure.in","r",stdin);
// freopen("treasure.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i = 1;i <= n; i++)
{
for(int j = 0;j < m;j++)
{
scanf("%d %d",&flag[i][j],&a[i][j]);
if(flag[i][j])
Floor[i]++;
}
}
cin >> sta;
for(int i = 1;i <= n;i++)
{
if(flag[i][sta])
{
ans = (ans + a[i][sta]) % MOD;
int step = (a[i][sta] % Floor[i] == 0 ? Floor[i] : a[i][sta] % Floor[i]);
for(int j = 1;j < step;)
{
if(sta == m) sta = -1;
if(flag[i][++sta]) j++;
}
}
else{
ans = (ans + a[i][sta]) % MOD;
int step = (a[i][sta] % Floor[i] == 0 ? Floor[i] : a[i][sta] % Floor[i]);
for(int j = 1;j <= step;)
{
if(sta == m) sta = -1;
if(flag[i][++sta]) j++;
}

}
}
printf("%lld",ans % MOD);
return 0;
}



一道dp

状态转移方程f[i][j + k] = f[i - 1][j] + f[i][j +k]

f[i][j] 代表处理到第i种花,j代表处理到的盆数

每次每种花都进行递推判断,最后组成答案。

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
#include<string>
//#include<map>
using namespace std;
const int MAXN = 105;
int n,m;
int a[MAXN];
int dp[MAXN][MAXN];
int main()
{
// freopen("flower.in","r",stdin);
// freopen("flower.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
}
dp[0][0] = 1; 
for(int i = 1;i <= n;i++)
{
for(int k = 0;k <= a[i];k++)
{
for(int j = 0;j <= m - k;j++)
{
dp[i][j+k] = (dp[i - 1][j] + dp[i][j + k]) % 1000007;
}
}
}
printf("%d",dp[n][m]);
return 0;


迷。

大家觉得题意是不是一个人不断地学,然后每一个后面的城市文化有与他已经学过的文化冲突的就去不了?

但是实际上居然是只看相邻的,感情这家伙学了就忘???

好吧这样就很简单了,有冲突的赋值为最大值,也就相当于去不了啦。

然后常规Floyd就行了。

////#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
#include<string>
////#include<map>
using namespace std;
int n,k,m,s,t;
int spe[105];
int fight[105][105];
int now;
int ojbk = 0;
int Map[105][105];
long long ans;
void floyd(int sta,int end)
{
for(int k = 1;k <= n; k++)
{
for(int i = 1;i <= n; i++)
{
for(int j = 1;j <= n; j++)
{
if(Map[i][k] + Map[k][j] < Map[i][j])
Map[i][j] = Map[i][k] + Map[k][j];
}
}
}
}
int main()
{
// freopen("culture.in","r",stdin);
// freopen("culture.out","w",stdout);
scanf("%d %d %d %d %d",&n,&k,&m,&s,&t);
for(int i = 1;i <= k;i++)
{
scanf("%d",&spe[i]);
}
for(int i = 1;i <= k;i++)
{
for(int j = 1;j <= k;j++)
{
int flag;
scanf("%d",&flag);
if(flag == 1)
{
fight[i][j] = 1;
}
}
}
if(fight[s][t]){
printf("-1");
return 0;
}
for(int i = 1;i <= n; i++)
for(int j = 1;j <= n; j++)
{
if(i != j)
Map[i][j] = 0x3f3f3f3f;
}
for(int i = 1;i <= m; i++)
{
int u,v,price;
scanf("%d %d %d",&u,&v,&price);
Map[u][v] = price;
Map[v][u] = price;
}
printf("%d",Map[s][t]);
floyd(s,t);
ans = Map[s][t];
printf("%d",ans);
return 0;
}

猜你喜欢

转载自blog.csdn.net/chang_yl/article/details/79508623