#第一题
题目大意
有1024元钱 输入你花掉的数目问找回的硬币数最小
有64 16 4 1 的硬币
水题 代码没存 Pycharm可以恢复真是太强了
整数除硬币面额 再求和
n=input()
n=int(n)
n=1024-n
ans=0
ans+=n//64
n-=64*(n//64)
ans+=n//16
n-=16*(n//16)
ans+=n//4
ans+=(n-4*(n//4))
print(ans)
#第二题
题目大意
在字符串中有连续的三个字母要去掉一个
有连续的AABB型的 要去掉第二对中的一个字母 即AAB
匹配顺序是从左到右例如AABBCC 结果为AABCC
保存在电脑上的代码好像是AC的那一版
n=input()
n=int(n)
for _ in range(0,n):
line=input()
line=list(line)
i=0
while i<len(line)-2:
if(i<len(line)-2):
if(line[i]==line[i+1]==line[i+2]):
del(line[i+2])
i-=1
if(i<len(line)-3):
if(line[i]==line[i+1] and line[i+2]==line[i+3]):
del(line[i+3])
i-=1
i+=1
print(''.join(line))
#第三题
题目大意
有n个人 围成一圈每个人都有自己的分数
规定
1.当前人的分数如果大于左右人的分数
那么也要比左右人获得更多的礼物
2.每人至少有一个礼物
求礼物数最小
有一组样例
2
5
1 2 3 4 5
5
5 4 3 2 1
结果都是15
错误解法:(待填坑) 已填
#include <iostream>
#include <cstdio>
#include <math.h>
#include<algorithm>
#include<cstring>
using namespace std;
int xx[100005];
int cc[100005];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int minn=10000000;
int mini;
int cnt=0;
for(int i=0; i<n; i++)
{
scanf("%d",&xx[i]);
if(xx[i]<minn)
{
minn=xx[i];
mini=i;
}
}
if(n==1)
cout<<1<<endl;
else if(n==2)
{
if(xx[0]!=xx[1])
cout<<3<<endl;
else
cout<<2<<endl;
}
else
{
memset(cc,0,sizeof(cc));
long long ans1=0;
int minii=mini;
cc[mini]=1;
cnt=1;
ans1+=1;
while(cnt<=n-1) //顺时针
{
mini+=1;
mini%=n;
if(xx[(mini-1+n)%n]<xx[mini] && xx[mini]>xx[(mini+1)%n] )
cc[mini]=max(cc[(mini-1+n)%n],cc[(mini+1)%n])+1;
else if(xx[(mini-1+n)%n]<xx[mini] )
cc[mini]=cc[(mini-1+n)%n]+1;
else if(xx[mini]>xx[(mini+1)%n])
cc[mini]=cc[(mini+1)%n]+1;
if(cc[mini]==0)
cc[mini]=1;
cnt++;
// cout<<mini<<" "<<cc[mini]<<endl;
ans1+=cc[mini];
}
memset(cc,0,sizeof(cc));
long long ans2=0;
mini=minii;
cc[mini]=1;
cnt=1;
ans2+=1;
while(cnt<=n-1) //逆时针
{
mini-=1;
if(mini<0)
mini+=n;
mini%=n;
if(xx[(mini-1+n)%n]<xx[mini] && xx[mini]>xx[(mini+1)%n] )
cc[mini]=max(cc[(mini-1+n)%n],cc[(mini+1)%n])+1;
else if(xx[(mini-1+n)%n]<xx[mini] )
cc[mini]=cc[(mini-1+n)%n]+1;
else if(xx[mini]>xx[(mini+1)%n])
cc[mini]=cc[(mini+1)%n]+1;
if(cc[mini]==0)
cc[mini]=1;
cnt++;
// cout<<mini<<" "<<cc[mini]<<endl;
ans2+=cc[mini];
}
cout<<max(ans1,ans2)<<endl;
}
}
return 0;
}
#include <iostream>
#include <vector>
#include <queue>
#define maxn 100001
using namespace std;
vector<int>G[maxn];
int deg[maxn], wei[maxn];
void addedge(int from, int to) {
++deg[from];
G[to].push_back(from);
}
int main() {
int n,T;
cin >> T;
while(T--){
cin >> n;
for (int i = 0; i < n; i++) {
cin >> wei[i];
}
for (int i = 0; i < n; i ++) {
int las = (i - 1 + n) % n;
if (wei[las] < wei[i]) {
addedge(i, las);
} else if (wei[las] > wei[i]) {
addedge(las, i);
}
}
int cnt = 1, ans = 0, nodes = 0;
queue<int>que;
bzero(wei, sizeof(wei));
while (nodes != n) {
for (int i = 0; i < n; i ++) {
if (deg[i] == 0 && !wei[i]) {
wei[i] = 1;
ans += cnt;
que.push(i);
++nodes;
}
}
while (!que.empty()) {
int t = que.front();
que.pop();
for (int i = 0; i < G[t].size(); i++) {
--deg[G[t][i]];
}
}
++cnt;
}
cout << ans<< endl;
}
}
#第四题
题目大意
有n根长度为Li的绳子
需要m根相同长度的绳子
问最大的相同长度是多少 二分裸题 精度一开始开了1e-5 改了1e-4过了
#include <iostream>
#include <cstdio>
#include <math.h>
#include<algorithm>
using namespace std;
int c[100005];
int main()
{
long long n,m;
cin>>n>>m;
long long sum=0;
for(int i=0;i<n;i++)
{
cin>>c[i];
sum+=c[i];
}
if(sum<m)
cout<<"0.00"<<endl;
else
{
double l,r,mid;
l=0,r=1000000009;
long long cnt=0;
while((r-l)>1e-4)
{
mid=(l+r)/2;
cnt=0;
for(int i=0;i<n;i++)
{
cnt+=int(c[i]/mid);
}
// cout<<cnt<<endl;
if(cnt<m)
r=mid;
else
l=mid;
}
printf("%.2lf\n",mid);
}
return 0;
}