105
#include
#include
#include
using namespace std;
int main(){
int a,b,c;
for(a = 1; a < 420; a++){
for(b = 1; b < 420; b++){
for(c = 1; c < 420; c++){
if(3*a+7*b+c == 315 && 4*a+10*b+c == 420){
printf("%d\n",a+b+c);
}
}
}
}
return 0;
}
如【图1.png】那样组合,就是一种解法。此时,
紧贴上边沿的是:60 5050 33 30 41
bfs写虽然时间大约花费6s,但是填空题这个速度还是可以忍的
code:
#include
#include
#include
using namespace std;
int a[19] = {2,5,9,11,16,17,19,21,22,24,26,30,31,33,35,36,41,50, 52};//从小到大排好序
int mp[154][154];
int vis[100];
void Fill(int x,int y,int n,int num){
for(int i = x; i < x+n; i++){
for(int j = y; j < y+n; j++){
mp[i][j] = num;
}
}
}
int solve(){
for(int i = 0; i < 154; i++){
for(int j = 0; j < 154; j++){
if(!mp[i][j])//如果有空格,说明这种放法失败
return 0;
}
}
return 1;
}
int judge(int x,int y,int n){
if(x + n > 154 || y + n > 154)
return 0;
for(int i = x; i < n+x; i++){
for(int j = y; j < n+y; j++){
if(mp[i][j])//如果这个位置已经放了,不能重叠
return 0;
}
}
return 1;
}
int dfs(){
if(solve())
return 1;
else{
int x,y;
int flag = 1;
for(int i = 0; i < 154 && flag; i++){
for(int j = 0; j < 154 && flag; j++){
if(!mp[i][j]){//枚举空位置
x = i;
y = j;
flag = 0;
}
}
}
for(int k = 0; k < 19; k++){
if(judge(x,y,a[k])){
if(!vis[k]){
Fill(x,y,a[k],a[k]);
vis[k] = 1;
if(dfs())
return 1;
Fill(x,y,a[k],0);
vis[k] = 0;
}
}
else break;//因为数字是从小到大排好序的如果当前都不行后面更大的就更不用考虑了
}
}
return 0;
}
int main(){
memset(vis,0,sizeof(vis));
memset(mp,0,sizeof(mp));
Fill(0,0,47,47);
Fill(0,47,46,46);
Fill(0,93,61,61);
dfs();
int ans = 0;
for(int i = 0; i < 154; i++){
if(mp[153][i] != ans){
printf("%d ",mp[153][i]);
ans = mp[153][i];
}
}
return 0;
}
#include
#define N 100
int connected(int* m, int p, int q)
{
return m[p]==m[q]? 1 : 0;
}
void link(int* m, int p, int q)
{
int i;
if(connected(m,p,q)) return;
int pID = m[p];
int qID = m[q];
for(i=0; i
code:
#include
#include
#include
using namespace std;
char str[1024*1024+10],s[10];
int a[1024*1024+10][26],b[26];
int main(){
int n;
int len,len2;
int sum = 0;
memset(a,0,sizeof(a));
scanf("%s",str);
len = strlen(str);
len -= 8;//最多可以枚举多少个长度为8的区间,从头开始
for(int i = 0; i <= len; i++){//预处理出每个区间内包含的字母个数
for(int j = i; j <= i+7; j++){
a[i][str[j]-'a'] += 1;
}
}
scanf("%d",&n);
for(int k = 0; k < n; k++){
int flag;
memset(b,0,sizeof(b));
scanf("%s",s);
len2 = strlen(s);
for(int i = 0; i < len2; i++){//枚举密码的字母个数
b[s[i]-'a'] += 1;
}
for(int i = 0; i <= len; i++){
flag = 1;
for(int j = 0; j < 26; j++){//检查是否和这个区间的字母个数全部匹配
if(a[i][j] != b[j]){
flag = 0;
break;
}
}
if(flag) sum++;
}
}
printf("%d\n",sum);
return 0;
}
这道题网上找的一种解法,还是很不错的,过了30%的数据(30/100),思路是先用前缀和预处理然后三重循环枚举区间,欢迎提问,后面的大数据不可避免的会超时,但是已经想不到更好优化了,网上有dp写的,那是错的!!
code:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
小宏想给他的玩具染上不超过k种颜色,这样玩具看上去会不一样。如果通过变换可以使得玩具变成完全相同的颜色模式,则认为是本质相同的染色。现在小宏想知道,可能有多少种本质不同的染色。