C. 袋鼠媽媽找孩子
Time limit per test: 1.5 seconds
Memory limit: 256 megabytes
Accept / Submit: 41 / 172
袋鼠媽媽找不到她的孩子了。她的孩子被怪獸抓走了。
袋鼠媽媽現在在地圖的左上角,她的孩子在地圖第
請設計這樣一個迷宮。
Input
第一行兩個整數
第二行三個整數
Output
輸出一個地圖,應正好
用 .
表示空地,用 *
表示牆。袋鼠媽媽所在的位置和孩子所在的位置用 .
表示。
數據保證有解。
Examples
2 6 1 3 4
.*.*** ......
題目鏈接:http://acm.ecnu.edu.cn/problem/3260/
AC代碼:
/**
* 行有餘力,則來刷題!
* 博客鏈接:http://blog.csdn.net/hurmishine
*
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=10;
char a[maxn][maxn];
int dir[4][2]= {1,0,0,1,-1,0,0,-1};
int n,m;
int ex,ey,T;
bool DFS(int x,int y,int t)//當前位置,所用時間
{
if(x==1&&y==1)
return t>=T;
for(int i=0; i<4; i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(!xx||!yy||xx>n||yy>m||a[xx][yy]!='*')
continue;
int cnt=0;
//(xx,yy)這個點只能由(x,y)到達
for(int j=0;j<4;j++)
{
int u=xx+dir[j][0];
int v=yy+dir[j][1];
if(a[u][v]=='.')
cnt++;
}
if(cnt>1)
continue;
a[xx][yy]='.';
if(DFS(xx,yy,t+1))
return true;
a[xx][yy]='*';
}
return false;
}
int main()
{
//freopen("C:\\Documents and Settings\\Administrator\\桌面\\data.txt","r",stdin);
while(cin>>n>>m)
{
cin>>ex>>ey>>T;
memset(a,'*',sizeof(a));
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
a[i][j]='*';
}
a[ex][ey]='.';
DFS(ex,ey,0);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<a[i][j];
cout<<endl;
}
}
return 0;
}
E. 黑心啤酒廠
Time limit per test: 1.0 seconds
Memory limit: 256 megabytes
Accept / Submit: 1184 / 4093
黑心啤酒廠爲了讓大家買啤酒,會把一瓶酒設計成恰好能倒七杯。由於聚會時經常會有大家一起幹杯這樣的事情,乾杯之前又要給每個人都倒滿,所以來兩個人的時候,幹完三輪,恰好多一杯;三個人的時候,幹完兩輪,恰好多一杯;四個人的時候會多三杯。在上述情況下,爲了踐行不浪費的原則,就會多買一瓶啤酒,再幹一輪。當然多買的啤酒可能又有多了……然後循環往復,喝了好多好多。直到啤酒剛剛好喝完爲止。
現在啤酒廠把酒瓶設計成剛好能倒
Input
輸入只有一行,兩個整數
Output
輸出
Examples
7 5
2 3 4 5
暴力枚舉肯定超時,簡單用數學知識推一下就可以了.
假設需要k瓶,則
kx%n=0
-->gcd=GCD(x,n)
-->k=x/gcd*n/x
計算
AC代碼:
**
* 行有餘力,則來刷題!
* 博客鏈接:http://blog.csdn.net/hurmishine
*
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=0;
typedef long long LL;
LL GCD(LL x,LL y)
{
if(y==0)
return x;
return GCD(y,x%y);
}
int main()
{
//freopen("C:\\Documents and Settings\\Administrator\\桌面\\data.txt","r",stdin);
LL x,n;
while(cin>>x>>n)
{
for(LL y=2; y<=n; y++)
{
LL gcd=GCD(x,y);
cout<<x/gcd*y/x<<endl;
}
}
return 0;
}
F. 麗娃河的狼人傳說
Time limit per test: 1.0 seconds
Memory limit: 256 megabytes
Accept / Submit: 224 / 1759
麗娃河是華師大著名的風景線。但由於學校財政緊缺,麗娃河邊的路燈年久失修,一到晚上就會出現走在河邊要打着手電的情況,不僅非常不方便,而且影響安全:已經發生了大大小小的事故多起。
方便起見,麗娃河可以看成是從
請問至少還要安裝多少路燈。
Input
第一行一個整數
對於每組數據:
-
第一行三個整數
n,m,k (1≤n≤103,1≤m≤103,1≤k≤n) 。 -
第二行
k 個不同的整數用空格隔開,表示這些位置一開始就有路燈。 -
接下來
m 行表示約束條件。第i 行三個整數li,ri,ti 表示:第i 個區間[li,ri] 至少要安裝ti 盞路燈(1≤li≤ri≤n,1≤ti≤n) 。
Output
對於每組數據,輸出 Case x: y
。其中
x 表示測試數據編號(從 1 開始),y 表示至少要安裝的路燈數目。如果無解,y 爲
Examples
3 5 1 3 1 3 5 2 3 2 5 2 3 1 3 5 2 3 2 3 5 3 5 2 3 1 3 5 2 3 2 4 5 1
Case 1: 1 Case 2: 2 Case 3: 1
Note
因爲今天不是滿月,所以狼人沒有出現。
暴力貪心可以過,當然也有更好的方法.
AC代碼:
/**
* 行有餘力,則來刷題!
* 博客鏈接:http://blog.csdn.net/hurmishine
*
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e3+5;
int n,m,k;
struct Node
{
int l,r,s;
}a[maxn];
bool vis[maxn];
bool cmp(Node x,Node y)
{
return x.r<y.r;
}
int solve()
{
int ans=0;
for(int i=0;i<m;i++)
{
if(a[i].r-a[i].l+1<a[i].s)
return -1;
int cnt=0;
for(int j=a[i].l;j<=a[i].r;j++)
cnt+=vis[j];
if(cnt>=a[i].s)
continue;
for(int j=a[i].r;j>=a[i].l;j--)
{
if(!vis[j])
{
vis[j]=true;
cnt++;
ans++;
if(cnt==a[i].s)
break;
}
}
}
return ans;
}
int main()
{
//freopen("C:\\Documents and Settings\\Administrator\\桌面\\data.txt","r",stdin);
int T,kase=0;
cin>>T;
while(T--)
{
cin>>n>>m>>k;
int x;
memset(vis,false,sizeof(vis));
for(int i=0;i<k;i++)
{
cin>>x;
vis[x]=true;
}
int l,r,k;
for(int i=0;i<m;i++)
{
cin>>l>>r>>k;
a[i]=Node{l,r,k};
}
sort(a,a+m,cmp);
printf("Case %d: %d\n",++kase,solve());
}
return 0;
}
G. 鐵路修復計劃
Time limit per test: 2.0 seconds
Memory limit: 256 megabytes
Accept / Submit: 146 / 1219
在 A 國有很多城際鐵路。這些鐵路都連接兩個城市(城市從
不過在一次星球大戰之後,所有的鐵路都經歷了不同程度的損傷以至於無法通行了。由於經費緊缺,A 國政府不願意再出資造新的鐵路。對於原有的城際鐵路,根據鐵路的實際情況,有以下兩種處理辦法:
- 使用國內技術進行修復:主要針對損壞情況不是很嚴重的鐵路。國內公司會對鐵路狀況進行評估,然後如實開出鐵路修復的費用。
- 使用國外技術進行修復:主要針對損壞情況嚴重的鐵路。國外公司也會對鐵路情況進行評估,然後按照鐵路實際修復費用的
k 倍來收費(其中k 是一個由國外公司決定的實數,不管怎麼說,優惠是不可能的,所以k≥1 )。
A國政府修復鐵路的總預算是
國外公司通過不知什麼途徑瞭解到了 A 國政府的總預算
Input
測試數據包含不超過 30 個測試文件。每個測試文件是單個測試點。
第一行是三個整數
接下來
輸入保證:
- 在國外公司不亂收費
(k=1) 的情況下,使用預算能完成要求。 - 完全不使用國外技術,只使用國內技術,是不能完成目標的。
Output
求
Examples
3 3 9 1 2 1 1 1 3 2 0 2 3 1 1
7.000000
3 3 9 1 2 1 1 1 3 2 1 2 3 2 1
3.000000
二分就可以了,
AC代碼:
/**
* 行有餘力,則來刷題!
* 博客鏈接:http://blog.csdn.net/hurmishine
*
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100005;//1e5+5;
int n,m;
double M,k;
struct Node
{
int u,v,f;
double w;
}a[maxn];
int fa[maxn];
int Find(int x)
{
if(fa[x]==x)
return x;
return fa[x]=Find(fa[x]);
}
bool cmp(Node &a,Node &b)
{
double x,y;
if(a.f)
x=a.w*k;
else
x=a.w;
if(b.f)
y=b.w*k;
else
y=b.w;
return x<y;
}
bool OK()
{
for(int i=0;i<=n;i++)
fa[i]=i;
sort(a+1,a+1+m,cmp);
double sum=0;
int cnt=0;
for(int i=1;i<=m;i++)
{
int fu=Find(a[i].u);
int fv=Find(a[i].v);
if(fu==fv)
continue;
fa[fu]=fv;
if(a[i].f)
sum+=a[i].w*k;
else
sum+=a[i].w;
if(++cnt==n-1)
break;
}
return sum<=M;
}
int main()
{
//freopen("C:\\Documents and Settings\\Administrator\\桌面\\data.txt","r",stdin);
while(cin>>n>>m>>M)
{
double minn=100000000;//1e5;
for(int i=1;i<=m;i++)
{
//cin>>a[i].u>>a[i].v>>a[i].w>>a[i].f;
scanf("%d%d%lf%d",&a[i].u,&a[i].v,&a[i].w,&a[i].f);
if(a[i].f)
minn=min(a[i].w,minn);
}
double l=1,r=M/minn;
while(fabs(r-l)>1e-6)
{
//cout<<l<<","<<r<<endl;
double mid = (l+r)/2;
k=mid;
if(OK())
l=mid;
else
r=mid;
}
printf("%.6f\n",l);
}
return 0;
}
剩下的題,隨緣吧.