2 3 3
1 1 -1 0
-1 1 1 1
1 1 -1 1
1
在样例 1 中,G1 和 G2 第 1 次打鸣的响度值分别为 2 和 3,不相同。第 1 次协商 G1 增加 1,G2 减少 0,响度值分别为 3 和 3,所以经过 1 次协商后它们两个打鸣的响度值已经相同。经过 3 次协商时,它们的声音也能调成一样,但至少需要 1 次协商就可以了。
分析:
水题巨坑
AC代码:
#include
int main (){
int x,y,k;
while (scanf("%d%d%d",&x,&y,&k)!=EOF){
int ai,xi,bi,yi;
int count=0;
int flag=0;
int ans=0;
if (x==y){
printf ("0\n");
continue;
}
while (k--){
scanf ("%d%d%d%d",&ai,&xi,&bi,&yi);
if (ai==1)
x+=xi;
else if (ai==-1){
x-=xi;
if (x<0)
x=0;
}
if (bi==1)
y+=yi;
else if (bi==-1){
y-=yi;
if (y<0)
y=0;
}
count++;
if (x==y&&!flag){
ans=count;
flag=1;
}
}
if (flag)
printf ("%d\n",ans);
else
printf ("-1\n");
}
return 0;
}
3 3 3
2 3 4
5
分析:
同样水题巨坑 比赛是智商为0没A
AC代码:
#include
#include
int num[100000];
int main (){
int n,t,x;
while (scanf("%d%d%d",&n,&t,&x)!=EOF){
for (int i=0;it){
printf ("-1\n");
continue;
}
int ans=x;
int time=num[0];
for (int i=0;i
5 4
1 2 1 2 3
2
分析:
类似最大的子段和 两层超时 感谢队友思路
AC代码:
#include
#include
int num[100005];
int main (){
int n,t;
while (scanf ("%d%d",&n,&t)!=EOF){
int min=0x3f3f3f3f;
memset(num,0,sizeof(num));
for (int i=1;i<=n;i++){
scanf ("%d",&num[i]);
num[i]+=num[i-1];
}
if (num[n]=t){
if (min>i-r)
min=i-r;
r++;
if (r>=i)
break;
}
}
printf ("%d\n",min);
}
return 0;
}
2 1
2 1
2
5 100
3
4 100
3 100
7 100
30.00
分析:
同样水题
AC代码:
#include
int main (){
int x,y;
while (scanf("%d%d",&x,&y)!=EOF){
double temp=(1.0*x/y)*1000;
double min=0x3f3f3f3f;
int n;
scanf("%d",&n);
while (n--){
int a,b;
double ans;
scanf ("%d%d",&a,&b);
ans=(1.0*a/b)*1000;
if (min>ans)
min=ans;
}
printf ("%.2lf\n",temp
ANA
ANA
DAR
DAR
RAD
RAD
DAR
ANA
RAD
分析:
大力出奇迹的题目 一共A(3,6)种排列 枚举一遍即可
AC代码:
#include
#include
using namespace std;
string str[6];
int search(int i,int j,int k){
int flag;
for (int l=0;l<6;l++){
flag=1;
if (l!=i&&l!=j&&l!=k){
for (int p=0;p<3;p++){
if (str[l][0]==str[i][p]&&str[l][1]==str[j][p]&&str[l][2]==str[k][p]){
flag=0;
break;
}
}
if (flag)
return 0;
}
}
return 1;
}
int main (){
for (int i=0;i<6;i++){
cin>>str[i];
}
for (int i=0;i<5;i++){
for (int j=0;j<5-i;j++){
string temp;
if (str[j]>str[j+1]){
temp=str[j];
str[j]=str[j+1];
str[j+1]=temp;
}
}
}
for(int i=0;i<6;i++) {
for (int j=0;j<6;j++){
for (int k=0;k<6;k++){
if (i!=j&&j!=k&&i!=k){
if (search(i,j,k)){
cout<
2
2
1 号点与 2 号点连接:2 种。
1 号点与 4 号点连接:1 种。
1 号点与 6 号点连接:2 种。
分析:
然而并没有动态规划 卡特兰数
AC代码:
#include
long long num[3005];
int main (){
num[0]=1;
num[1]=1;
num[2]=2;
int n;
while (scanf("%d",&n)!=EOF){
for (int i=3;i<=n;i++){
for (int j=1;j<=i;j++){
num[i]=(num[i]+num[i-j]*num[j-1])%100000007;
}
}
printf ("%lld\n",num[n]);
}
return 0;
}
2 2 10 5
1 1
2 2
14
分析:
典型动态规划 两种选择 座、不座 感谢队友思路
AC代码:
#include
#include
#include
using namespace std;
int dp[150][150];
int main (){
int N,K,D,S;
while (scanf ("%d%d%d%d",&N,&K,&D,&S)!=EOF){
memset(dp,0x3f3f3f3f,sizeof(dp));
dp[0][0]=0;
int ti,zi;
for (int i=1;i<=K;i++){
for (int j=0;j<=N;j++)
dp[i][j]=dp[i-1][j];
scanf ("%d%d",&ti,&zi);
for (int j=0;j<=N;j++){
for (int k=0;k<=zi;k++){
if (j>=k)
dp[i][j]=min(dp[i][j],dp[i-1][j-k]+ti*k+D);
}
}
}
if (dp[K][N]!=0x3f3f3f3f)
printf ("%d\n",dp[K][N]);
else
printf ("impossible\n");
}
}
万圣节又到了!FJ打算带他的奶牛去参加化装晚会,但是,FJ只做了一套能容下两头总长不超过S (1≤S≤1000000)的奶牛恐怖服装。FJ养了N(2≤N≤20000)头按1--N顺序编号的奶牛,编号为i的奶牛的长度为L_i(1≤L_i≤1000000)。如果两头奶牛的总长度不超过S,那么她们就能穿下这套服装。
FJ想知道,如果他想选择两头不同的奶牛来穿这套衣服,一共有多少种满足条件的方案。
第1行是2个整数:N和S;
第2~N+l行每行一个整数:L_i。
1个整数,表示FJ可选择的所有方案数。注意奶牛顺序不同的两种方案是被视为相同的。
4 6
3
5
2
1
4
样例说明:4种选择分别为:奶牛1和奶牛3;奶牛l和奶牛4;奶牛2和奶牛4;奶牛3和奶牛4。
分析:
然而也没有分治 又被我给水过
AC代码:
#include
#include
#include
using namespace std;
int num[20005];
int cmp(int a,int b){
return a>b;
}
int main (){
int n,s;
while (scanf("%d%d",&n,&s)!=EOF){
memset(num,0,sizeof(num));
for (int i=0;ii){
count++;
j--;
}
}
printf ("%d\n",count);
}
return 0;
}
这是一个简化版的网络游戏:在一个N×N方块构成的棋盘中,每个方块均涂上红、黄、蓝、绿(记为l、2、3、4)中的一种颜色,游戏者可以在最底行任意找一个方块,用鼠标双击这个方块,于是该方块及与之相邻(即在上、下、左、右四个方向上有公共边)的所有的同色方块均被消掉,而因下方失去支持的方块将会自由落下填补空位。样例中给出一个4×4的棋盘样例,当游戏者双击最底层左边第二个方块后,将会形成输出结果的布局。
你的任务是编写一个泡泡龙模拟程序,对于给定的一个初始棋盘,计算游戏者双击最底层某个方块后棋盘的布局将会如何。
第1行有两个正整数N和M(I≤M≤N≤I00),其中N表示棋盘的规模,而M则表示游戏者将双击最底层从左边数起的第M个方块。接下来的N行每行有N个l~4的整数组成,表示一个初始的棋盘,同一行相邻两个数之间用一个空格隔开。
N行,每行用N个数给出游戏结束后棋盘的布局,没有方块的格子用0表示,同一行相邻两个数之间也用一个空格分开。每行末尾有空格
4 2
1 2 3 4
4 2 4 4
3 4 4 3
1 4 4 3
1 0 0 0
4 0 0 0
3 2 0 3
1 2 3 3
分析:
简单搜做题目 没有坑
AC代码:
#include
#include
int map[105][105];
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int temp;
int n,m;
int judge(int x,int y){
if (x<0||y<0||x>=n||y>=n)
return 0;
return 1;
}
void dfs(int x,int y){
if (map[x][y]==temp)
map[x][y]=0;
for(int i=0;i<4;i++){
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if (judge(tx,ty)&&map[tx][ty]==temp){
dfs(tx,ty);
}
}
}
int main (){
while (scanf("%d%d",&n,&m)!=EOF){
memset(map,0,sizeof(map));
for (int i=0;i