Educational Codeforces Round 54 (Rated for Div. 2) ABCD
阿新 • • 發佈:2018-12-02
題意:給出長度為 n 的字串 ,讓你刪去一個字元,使剩下的字元字典序最大
#include <iostream> #include <string> using namespace std; int main() { string s, s1; int n; cin >> n; cin >> s; for (int i = 0; i<s.size()-1; i++) { if (s[i]>s[i+1]) { s.erase(i,1);//從字串s中刪除第i個(從0開始 break; } if (i == s.size()-2)//到末尾 { s.erase(i+1);//刪除第i+1個之後所有的(從0開始 } } cout << s << endl; return 0; }
題意:給出一個數n,找出最小質因子,然後n-減去這個質因子,無限次這種迴圈直到n=0,求出一共需要進行多少次。
奇數減去第一次質因子後,變成偶數了,以後的質因子都是2
#include <iostream> using namespace std; long long n; int main(){ cin>>n; if(n%2==0){//偶數 cout<<n/2<<endl; return 0; } for(long long i=3;i*i<=n;i+=2){ if(n%i==0){//找到可以被整除的質因子 cout<<(n-i)/2+1<<endl; return 0; } } cout<<1<<endl;//本身就是素數 return 0; }
題意:輸入t組資料,每次輸入d,求解有沒有a+b=d,a*b=d,有就輸出Y,a,b,沒有就輸出N。
題解:高中知識:求根公式 由題意 經過簡單的數學變換 b=(d-a) ---> a^2-ad+d=0.
形如ax^2+bx+c=0, (x=1) . 所以利用求根公式求解兩根,-b+sqrt(b^2-4ac)/2,這裡的a=1,b=-d,c=d,帶入求解就是答案。
求解之前應該判斷有沒有解,b^2-4ac<0無解。
#include<bits/stdc++.h> using namespace std; int main() { int t,d; cin>>t; while(t--) { cin>>d; if(d*d-4*d<0) puts("N"); else printf("Y %.9f %.9f\n",(d+sqrt(d*d-4*d))/2,(d-sqrt(d*d-4*d))/2); } return 0; }
題意:給出n個點,m條邊,最多能保留K條邊。原圖上從源點1到每個點的最短路為di。現在刪除了邊後,使得 到源點1的距離 仍為di的 點 的數量 最多,輸出 應該保留的 K條邊 的編號。
思路:先跑1到所有點的最短距離中。遇到遍歷到當前邊的情況是最短路上的一條邊的時候,將這條邊加入答案(優先佇列)
#include<bits/stdc++.h>
using namespace std;
#define FI first
#define SE second
typedef long long ll;
typedef pair<ll,ll> P;
const int maxn = 3e5 + 7;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 998244353;
ll n, m, k;
ll u, v, c;
struct no {
ll u, c, id;
};
vector<no> vec[maxn];
struct node {
ll d, v, id;
bool operator< (const node &a) const {
return (d > a.d);
}
};
priority_queue<node> qu;
bool vis[maxn];
set<ll> ans;
int main() {
scanf("%lld%lld%lld", &n, &m, &k);
for(int i = 1; i <= m; ++i) {
scanf("%lld%lld%lld", &u, &v, &c);
vec[u].push_back(no{v, c, i});
vec[v].push_back(no{u, c, i});
}
for(auto i : vec[1]) {
qu.push(node{i.c, i.u, i.id});
}
vis[1] = 1;
int anss = k;
while(!qu.empty()) {
node t = qu.top(); qu.pop();
ll u = t.v, d = t.d, id = t.id;
if(vis[u]) continue;
vis[u] = 1;
if(k) {
k--;
ans.insert(id);
}
for(auto i : vec[u]) {
if(vis[i.u]) continue;
qu.push(node{d+i.c, i.u, i.id});
}
}
cout << ans.size() << endl;
int t = 0;
for(auto i : ans) {
t++;
printf("%lld", i);
if(t == ans.size()) break;
printf(" ");
}
return 0;
}
|